Java四大内部类代码示例

四大内部类

成员内部类

就是普通的内部类,放在类里声明

例如:

package com.yyl.statictest;

public class PubClassTest {
    
    

    private String outer;
    public String pouter;
    private static String visit="visit";

    class PubInnerClass{
    
    
        private String name;
        private int age;

        public PubInnerClass(String name, int age) {
    
    
            this.name = name;
            this.age = age;
        }
    }
}

当内部类访问外部类时,可以不受访问控制符的影响,直接访问属性与方法

public void visitOuter(){
    
    
    System.out.println(PubClassTest.visit);
    System.out.println(outer);
    System.out.println(pouter);
    System.out.println(PubClassTest.this.outer);
}

当外部类变量与方法和内部类同名,内部类默认访问自己的成员变量或方法,引用外部变量使用时加类名.this类名.this.变量名类名.this.方法名(),例如:

public void visitOuterSame(){
    
    
    System.out.println(PubClassTest.this.pouter);
    System.out.println(this.pouter);
}

在其他类创建一类中的内部类:内部类 对象名 = new 外部类对象( ).new 内部类( ),例如:

PubClassTest.PubInnerClass pubInnerClass = new PubClassTest().new PubInnerClass("22",22);

外部类不能直接使用内部类的成员和方法,如下报错,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。

image-20220925182615991

静态内部类

在成员内部类前加一个static修饰就是静态内部类

例如:

public class StaticTest {
    
    
    private String outer;
    private static String visit="visit";

    static class StaticInnerClass{
    
    
        private String name;
        private int age;

        public StaticInnerClass(String name, int age) {
    
    
            this.name = name;
            this.age = age;
        }
    }
}

静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问,例如

public void visitPubMem(){
    
    
    System.out.println(new StaticTest().outer);
}

外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员,例如

扫描二维码关注公众号,回复: 14523770 查看本文章
public void visitOuter(){
    
    
    System.out.println(StaticTest.visit);
}

创建静态内部类的对象时,不需要通过外部类的对象,可以直接创建 内部类 对象名= new 内部类();,例如

StaticTest.StaticInnerClass staticInnerClass = new StaticTest.StaticInnerClass("yyl",12);

局部内部类

定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。限制类的使用范围,只能在当前方法中使用。

例如:

package com.yyl.statictest;

public class LocalClassTest {
    
    
    private String outer="outer";
    private static String visit="visit";

    public void test(){
    
    
        String str = "string";

        class LocalInnerClass{
    
    
            private String name="localinnerclass";
            private int age;

            public void show(){
    
    
                System.out.println(str);
                System.out.println(visit);
                System.out.println(LocalClassTest.this.outer);
                System.out.println(name);
            }
        }

        LocalInnerClass localInnerClass = new LocalInnerClass();
        localInnerClass.show();
    }


    public static void main(String[] args) {
    
    
        LocalClassTest localClassTest = new LocalClassTest();
        localClassTest.test();
    }
}

运行结果如下:

image-20220925195357593

局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。不能在方法内部类中创建可变的局部变量,jdk1.8自动添加final

没有访问修饰符,但可以使用final或abstract修饰

可以访问外围类的成员变量。类名.this.变量名,例如:

System.out.println(LocalClassTest.this.outer);

局部内部类内不能有静态声明,即不能使用关键字static,如下

image-20220926083853964

在外部类方法中创建局部内部类对象才能调用局部内部类中方法

LocalInnerClass localInnerClass = new LocalInnerClass();
localInnerClass.show();

匿名内部类

使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

接口:

package com.yyl.statictest;

public interface AnonymousInterface {
    
    
    public void show();
}

匿名内部类实现:

package com.yyl.statictest;

public class AnonymousClassTest {
    
    
    public static void main(String[] args) {
    
    
        // 直接声明匿名类对象
        AnonymousInterface anonymousClassTest = new AnonymousInterface() {
    
    
            public int age;

            @Override
            public void show() {
    
    
                System.out.println("AnonymousClassTest。。。。。。");
            }
        };
        anonymousClassTest.show();

        // 方法里传入匿名内部类
        test(new AnonymousInterface(){
    
    
            @Override
            public void show() {
    
    
                System.out.println("test里的AnonymousInterface");
            }
        });
    }

    public static void test(AnonymousInterface anonymousInterface){
    
    
        anonymousInterface.show();
    }
}

匿名内部类中是不能定义构造函数的。

image-20220926085210577

匿名内部类中不能存在任何的静态成员变量和静态方法。

匿名内部类为局部内部类(即方法内部类),所以局部内部类的所有限制同样对匿名内部类生效。

匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

当所在的方法的形参需要被内部类里面使用时,该形参必须为final。

可以写代码块,初始化匿名内部类

匿名内部类可以很方便的定义回调。

使用内部类可以非常方便的编写事件驱动程序。

内部类的优点

  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
  2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
  3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便

猜你喜欢

转载自blog.csdn.net/weixin_45525272/article/details/127046995
今日推荐