内部类
可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类
成员内部类
最基本的一个内部类
下面的例子 介绍了如何创建一个成员内部类以及如何使用
成员内部类 是可以直接调用外部类的成员变量和方法的
如果外部类和内部类都有变量x,那么内部类直接使用的是自己内部类的x
如果想使用外部的同名变量,需要使用外部类.this.成员变量名
局部内部类
这就是一个局部内部类
匿名内部类
接口不能实例化,但是匿名内部类 就相当于new 了一个接口,然后在接口方法里实现
上面的最后一条注意事项:只能访问final型的局部变量,为什么呢???
原因:1.8之前,局部内部类只能访问final类型的变量,1.8的时候,可以将final修饰的变量,省略不写final
原因:从反编译的角度去理解
在.java文件编译成 .class字节码文件的时候,成员内部类是要单独放在另外一个文件中的,就是和原来文件是分离的,但是内部类使用了外部类的成员变量,所以JVM虚拟机就将外部的成员变量做了一个备份存储在 内部类文件中。如果这时成员变量是一个变量,在变化,那么在运行时,内部类文件就无法确定运行,就会产生不同的结果。所以规定 内部类 使用外部类的成员变量需要使用final修饰,让变量成为一个常量
再次总结这个问题:局部内部类只能访问final型的局部变量,为什么呢
因为在程序运行时,局部内部类会单独编译成一个文件,而使用的成员变量是以备份的形式存储在内部类文件中的。为了保证 程序运行时内部类的变量和外部的变量一致,不会出现逻辑错误,所以规定 只能访问final类型的局部变量
静态内部类
静态内部类和 成员内部类 相似但是又有区别
创建内部类的方式相似
区别:成员内部类是要先创建外部类,才能调用内部类
静态内部类创建出来之后,外部类还没有创建出来
静态内部类不能 访问外部类 非静态的资源,因为非静态的资源还没创建
静态内部类可以 访问外部类中 静态的资源