Java的内部类
Java的内部类(Inner Class)与C++所说的嵌套类(Nested Class)类似,只是说法不同而已。
Java有4种形式的内部类:静态内部类、成员内部类(普通内部类)、局部内部类、匿名内部类。
例如:
class outerClass{ static class innerClass{}//静态内部类 } class outerClass{ class innerClass{}//成员内部类(普通内部类) } class outerClass{ public void memberFunction(){ class innerClass{}//局部内部类 } } class MyFrame extends Frame{ //外部类 public MyFrame(){ addWindowListener(new WindowAdapter(){ //匿名内部类 public void windowClosing(WindowEvent e){ dispose(); System.exit(); } }); } }
- 静态内部类的特点:被声明为static的内部类,它可以不依赖于外部类的实例化而被实例化,而普通的内部类需要在外部类被实例化之后才能实例化。静态类不可以与外部类具有相同的名字,不能访问外部类的普通成员变量,只能访问外部类的静态成员、静态方法(包括私有类型)、构造函数。
- 成员内部类:静态内部类去掉static关键字就成为普通的成员内部类。成员内部类为非静态内部类,它能访问外部类的所有属性和方法。但它与一个外部类的实例绑定在一起,因此不可以有静态的属性和方法。成员内部类只能在外部类被实例化之后才能被实例化。
- 局部内部类:是指定义在一个代码块内的类,它的作用范围为其所在的代码块,是内部类中最少使用到的一种类型。局部内部类像局部变量一样,不能被public、protected、private、static修饰,只能访问方法中定义为final类型的局部变量。局部静态内部类与静态内部类的基本特性相同。
- 匿名内部类:是一种没有类名的内部类,不适用class,extends,implements,没有构造函数,它必须继承其他类或实现其他接口。使用匿名内部类的好处是使得代码更加简洁,但会使得代码可读性降低。它一般应用于GUI编程中的事件处理。匿名内部类不能定义自己的静态成员、方法和类。匿名内部类一定是跟在new的后面,匿名内部类也是一种局部内部类,所有对局部内部类的要求也适用于匿名内部类。
注:以上内容摘自何昊的《Java程序员面试笔试宝典》一书。