内部类分类
内部类和外部类会生成2个class文件,其中内部类是 Outer$Inner.class形式
成员内部类![](https://img-blog.csdnimg.cn/a40ef74d7b6840819eeddb229e20c0a0.png)
内部类可以声明static final的变量,但不可以声明static变量
可以用new Outer.new Inner方式创建对象,必须得先new外部类,再通过外部类new内部类,内部类的对象归属外部类对象
静态内部类
只有内部类可以用静态方法修饰,外部类用static会报错
静态内部类与非静态内部类之间的比较:
比如在外围类 Outer 中分别定义了一个私有、非静态属性 i,与一个私有、静态属性 j。那么静态内部类 Inner 只能访问 私有、静态属性 j
想在内部类访问外部类的非静态成员变量,要通过 new 外部类.成员变量 的方式
局部内部类
局部内部类:注意不能加任何访问修饰符。就跟局部变量不能加public/private等一样
内部类的有效范围只在这个方法内部,想要访问局部变量,必须是final的,否则报错
这是因为age是函数show的局部变量,在show结束后,age作为局部变量也会消失,但Inner的对象不会立刻被回收,如果此时引用了已经消失的age就有问题了。所以此时age应该是一个常量,在Inner内部引用的是一个常量,不会因show函数执行完而引用一个消失的对象
匿名内部类
先搞个接口
实际上就是创建了一个局部内部类,只是局部内部类的名字不是我们定义的,是系统定义的,这种跟下面的局部内部类伪代码没啥区别,但匿名内部类使用更多。下面的interface可以是接口,抽象类,父类等
等同于的伪代码
main function(){
Interface interface = new 局部内部类 implements Interface{
@Override
service(){ do something }
}
interface.service();
}
匿名内部类会生成一个 MyInterface$1.class 的文件,所以名字不是我们定义的,但会有
参考文章: