Core Java 笔记(七)

内部类

内部类是定义在另一个类中的类,使用内部类有三个主要原因:

  • 内部类方法可以访问该类定义所在的作用域中的数据(包括私有的)

  • 内部类可以对同一个包中的其他类隐藏起来

  • 匿名内部类可以方便地定义一个回调函数

一、使用内部类访问对象状态

先看一个简单的例子:

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); 
    // ...
}

二、语法

猜你喜欢

转载自www.cnblogs.com/zzzt20/p/11530975.html