内部类( inner class)是定义在另一个类中的类。
为什么需要使用内部类:
- 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
- 内部类可以对同一个包中的其他类隐藏起来
- 当想要定义一个回调函数而不想写大量代码时,使用匿名内部类比较便捷
1 访问状态
内部类的构造器具有外部类的隐式引用 outer。
只有内部类可以是私有类。
2 使用方法
引用外围类
OuterClass.this
编写内部类构造器
outerObject.new InnerClass(contruction parameters)
在外围类的作用域之外引用内部类
OuterClass.InnerClass
3 局部内部类
可以在一个方法中定义局部类,作用域被限定在声明这个局部类的块中。
对外部世界完全隐藏,除了定义它的方法外,没有任何方法知道它的存在。
可以访问包含它们的外部类,和 final 局部变量
4 匿名内部类
假如只创建一个这个类的对象,就不必命名了,这种类被称为匿名内部类
匿名类不能有构造器,需要将参数传递给超类构造器;内部类实现接口时不能有任何构造参数。
SuperType 可以是接口,内部类就要实现这个接口;也可以是一个类,内部类就要扩展它。
new SuperType(construction parameters){
inner class methods and data
}
主要用在回调,如今推荐用 lambda
5 静态内部类
有时候使用内部类仅为了把一个类隐藏在另一个类的内部,并不需要内部类引用外围类对象。为此可以将内部类声明为static,以便取消产生的引用。
只有内部类可以声明为static。静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样。
静态内部类的对象可以直接生成:
Outer.Inner in=new Outer.Inner();