一、静态内部类
静态内部类的存在不依赖于外部类,可以独立创建
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的。在实现上就是捕获并复制一份局部变量到内部类中,然后规定这样的局部变量不能修改。