内部类:
定义在另一个类的内部的类称为内部类。
内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。
为什么需要内部类的设计:
1. 一个内部类的对象能够访问创建它的对象的所有元素,包括私有数据。
2. 对于同一个包中的其他类来说,内部类能够隐藏起来。(封装性)
3. 匿名内部类可以很方便的定义回调。 (接口实现,多继承)
4. 使用内部类可以非常方便的编写事件驱动程序。
5. 可以避免修改接口而实现同一个类中两种同名方法的调用
当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内部类来实现。用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。
内部类分为成员内部类,局部内部类,匿名内部类,静态内部类。
其中前三者为非静态内部类。
成员内部类:
作为外部类的一个成员存在,与外部类的属性、方法并列。
成员内部类中不能定义静态变量
可以访问外部类的所有成员和属性,包括私有成员。
用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
匿名内部类:
是一种特殊的局部内部类,它是通过匿名类实现接口。
一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。
匿名内部类是唯一一种无构造方法类。大部分匿名内部类是用于接口回调用的。匿名内部类在编译的时候由系统自动起名Out$1.class。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。匿名内部类中不能定义构造方法。
一个类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的事先或是覆盖。
常用于实现事件驱动接口或回调接口。
静态内部类中可以定义静态或者非静态的成员
静态内部类可以用public,protected,private修饰
Outer.Inner in=new Outer.Inner();
而不需要通过生成外部类对象来生成。