内部类
内部类是定义在另一个类中的类
为什么需要使用内部类
- 内部类可以对同一个包中的其他类隐藏
- 内部类方法可以访问定义这个类的作用域中的数据,包括原本私有的数据
内部类原先对于简洁地实现回调非常重要,
不过如今lambda表达式在这方面可以做得更好。
但内部类对于构建代码还是很有用的。
一个内部类方法可以访问自身的数据字段,也可以访问创建它的外围类对象的数据字段。
为此,内部类的对象总有一个隐式引用,指向创建它的外部类对象。
这个引用在内部类的定义中是不可见的。
只有内部类可以是私有的,而常规类可以有包可见性/公共可见性
使用外围类引用的正规语法的表达式:外部类名.this
可以采用以下语法编写内部类对象的构造器:outerObject.new InnerClass(construction parameters)
可以这样引用内部类:OuterClass.InnerClass
内部类中声明的所有静态字段都必须是final。并初始化为一个编译时常量。
如果这个字段不是一个常量,就可能不唯一。
内部类不能有static方法。(Java语言规范对这个限制没做解释),所以也可以允许有静态方法,但只能访问外围类的静态字段和方法。
内部类是一个编译器现象,与虚拟机无关。
编译器会把内部类转换为常规的类文件。用\(分隔外部类名与内部类名,而虚拟机对此一无所知。
例如,TalkingClock类内部的TimePrinter类将被转换成类文件TalkingClock\)TimePrinter.class