内部类(Inner Classes)的概念是在 JDK1.1 版本中开始引入的。在 Java 中,允许在一个类(或方法、语句块)的内部定义另一个类,称为内部类,有时也称为嵌套类(Nested Classes)。内部类和外层封装它的类之间存在逻辑上的所属关系,一般只用在定义它的类或语句块之内,实现一些没有通用意义的功能逻辑,在外部引用它时必须给出完整的名称。 引入内部类的好处在于可使源代码更加清晰并减少类的命名冲突,就好比工厂制定内部通用的产品或工艺标准,可以取任何名称而不必担心和外界的标准同名,因为其使用范围不同。内部类是一个有用的特征,因为它们允许将逻辑上同属性的类组合到一起,并在另一个类中控制一个类的可视性。
下述例子表示使用内部类的共同方法: class MyFrame extends Frame { Button myButton; TextArea myTextArea; int count; public MyFrame(String title) { super(title); myButton = new Button(“click me”); myTextArea = new TextArea(); add(myButton, BorderLayout.CENTER); add(myTextArea, BorderLayout.NORTH); ButtonListener bList = new ButtonListener(); myButton.addActionListener(bList); } class ButtonListener implements ActionListener{ // 这里定义了一个内部类 public void actionPerformed(ActionEvent e) { count++; myTextArea.setText(“button clicked ” + count + ” times”); } } // end of innerclass ButtonListener public static void main(String args[]) { MyFrame f = new MyFrame(“Inner Class Frame”); f.setSize(300, 300); f.setVisible(true); } } 前面的例子包含一个类 MyFrame,它包括一个内部类 ButtonListener。编译器生成两个类文件,MyFrame$ButtonListener.class 以及 MyFrame.class。
(1)嵌套类(内部类)可以体现逻辑上的从属关系。同时对于其他类可以控制内部类对外不可见等。 (2)外部类的成员变量作用域是整个外部类,包括嵌套类。但外部类不能访问嵌套类的private 成员 (3)逻辑上相关的类可以在一起,可以有效的实现信息隐藏。 (4)内部类可以直接访问外部类的成员。可以用此实现多继承! (5)编译后,内部类也被编译为单独的类,不过名称为 outclass$inclass 的形式。
再来个例子: public class Outer { private int size; public class Inner { private int counter = 10; public void doStuff() { size++; } } public static void main(String args[]) { Outer outer = new Outer(); Inner inner = outer.new Inner(); inner.doStuff(); System.out.println(outer.size); System.out.println(inner.counter); // 编译错误,外部类不能访问内部类的private 变量 System.out.println(counter); } }