分类
成员内部类
得先创建外部类,然后才能创建内部类。
保存了一个指向外部对象的引用,所以可以访问外部对象的成员。
方法内部类
匿名内部类
匿名类没有名字,继承自父类或者实现了某个接口,它是没有构造器的,因为它连名字都没有。
通过使用实例初始化,就能达到为匿名内部类创建一个构造器的效果(其实就是在定义类的时候在大括号里面再加个大括号写入想要初始化的内容)。
静态内部类(嵌套类 Nested Class)
嵌套类的对象和外部类的对象没有关系。
不能访问非静态的外部类对象。
接口内部类
如果想要某些公共代码,可以被某个接口的所有不同实现所共用,则可以使用接口内部的嵌套类。
为什么需要内部类
先摘抄一段《Think in Java》里的解释:
每个接口都能独立的继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。也就是说,内部类允许继承多个非接口类型。
内部类可以有多个实例,每个实例都有自己的状态信息,并且其与外围类对象的信息相互独立。
在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
我自己的理解:
如果说类是Java中的一个基本单元,那么内部类的存在就打破了这种说法。内部类的粒度更小,它允许在类的内部进一步的DIY, 提供了更高的灵活性。