内部类
内部类是定义在另一个类中的类,使用内部类有三个主要原因:
-
内部类方法可以访问该类定义所在的作用域中的数据(包括私有的)
-
内部类可以对同一个包中的其他类隐藏起来
-
先看一个简单的例子:
public class TalkingClock { private int interval; private boolean beep; TalkingClock(int interval, boolean beep) {...} public void start() {...} // an inner class private class TimePrinter implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println("At the tone, the time is " + new Date()); if (beep) { Toolkit.getDefaultToolkit().beep(); } } } ... }
只有内部类可以是私有类,常规类只可以具有包/公有可见性。虽然 TimePrinter 类位于 TalkingClock 类的内部,但并不意味着每个 TalkingClock 都有一个 TimePrinter 实例域。
这个例子其实想说明一点:TimePrinter 类中没有名为 beep 的变量,取而代之的是 beep 引用了 TalkingClock 对象的域。将这个结论推广开来,内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域。
内部类为什么可以这么做?实际上,内部类的对象有一个隐式引用,指向外部类对象,在内部类的定义中是不可见的。这个引用在内部类的默认构造器中设置,这部分工作由编译器完成:
public TimePrinter(TalkingClock clock) { outer = clock; // outer 不是关键字,只是为了方便说明 }
当在某个方法中创建 TimePrinter 对象时,编译器会将 this 引用传递给构造器,不需要我们自己添加:
public void aMethodOfTalkingClock() { // ... ActionListener listener = new TimePrinter(); // parameter automatically added : ActionListener listener = new TimePrinter(this); // ... }