java 内部类

86 阅读1分钟

一、静态内部类

静态内部类的存在不依赖于外部类,可以独立创建

public class Demo2 {
    public static int i = 0;
    public static class Inner{
        public void inc(){
            //静态内部类中不能使用 .this 因为静态内部类可以不依赖于外部类创建。当静态内部类创建时,把外部类可能还不存在
//              Demo2.this;
            System.out.println(++i);
        }
    }
}

静态内部类是一个嵌套类,静态内部类的存在不依赖于外部类。可以直接创建一个静态内部类
Demo2.Inner inner = new Demo2.Inner();
inner.inc();
System.out.println(Demo2.i);

二、非静态内部类

非静态内部类依赖于外部类

public class Demo1 {
    private int i = 0;
    public class Inner {
        public Demo1 getOut(){
            //返回外部类
            return Demo1.this;
        }
    }
}
Demo1 demo1 = new Demo1();
//由外部类创建一个内部类
Demo1.Inner inner = demo1.new Inner();
// 由内部类返回外部类
Demo1 out = inner.getOut();

三、方法内部类

public class Demo3 {
    private int i = 0;

    public interface Inner{
        void inc();
    }
    //不能凭空在方法里创造一个内部类,因为外部类无法知道方法内部的情况。
    //必须继承一个类或实现一个接口
    public Inner getInner(){
        class In implements Inner {
            Demo3 that = Demo3.this;
            public void inc(){
                System.out.println(++i);
            }
        }
        return new In();
    }
}
Demo3 demo3 = new Demo3();
Demo3.Inner inner = demo3.getInner();
inner.inc();

四、匿名内部类

public class Demo4 {

    public Supplier<Integer> getSupplier(){
        //final i 不能被修改
        int i = 0;
       // i++;
        return new Supplier() {
            @Override
            public Object get() {
//              ++i;
              return i;
            }
        };
    }
}

五、内部类与闭包

1、内部类使用外部类的数字段,这个字段可以不是final的。内部类的创建依赖于外部类,在外部类的生命周期内这个字段一直存在。

2、内部类使用了方法内的局部变量,这个局部变量必须是final的或者说效果上是final的。在实现上就是捕获并复制一份局部变量到内部类中,然后规定这样的局部变量不能修改。