【问题标题】:Anonymous classes and interfaces匿名类和接口
【发布时间】:2015-04-25 04:27:14
【问题描述】:

我会用一个例子来说明我的问题:

addActionListener 方法接受一个 ActionListener 接口作为它的唯一参数。

那么当在一个对象/组件(比如一个Button)上调用那个方法来注册一个对象的监听器时,通过使用匿名内部类,为什么我们还需要实现Interface类?是不是因为根据定义,接口不能被实例化,除非你当然要创建一个实现该接口抽象方法的接口类型的对象?

aButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // do stuff
    }
});

也就是说,通过使用匿名类,我们可以显式避免使整个类实现接口(如在头文件中声明的那样),而是实例化接口的一个对象(根据接口的定义,这是不可能的)并在匿名类中实现接口的抽象方法。

因此只能实例化接口对象,因为在那个时间点,需要履行合同来实现接口的方法,并且这样做允许我们从接口?

因此,我们之所以可以实现接口的 actionPerformed() 方法,是因为我们已经从接口实例化了一个对象(这同时要求我们履行实现抽象方法的约定) ?那么是否可以说我们通过接口的原位实例化(作为 addActionListener 参数)“隐式”实现接口?

【问题讨论】:

  • 我认为你想多了。您正在定义一个实现接口的具体类,并实例化该具体类的对象。就像你有一个实现接口的命名类一样,除了没有给类命名。恐怕我不明白你在问什么。
  • 接口可以看作是定义了一组函数的契约,任何实现类都保证提供这些函数。 addActionListener 说“我需要一些可以做 ActionListener 的东西”

标签: java swing oop interface anonymous-class


【解决方案1】:

你没有实例化接口。

您正在定义和实例化一个实现接口的实际具体类。您需要实现接口中声明的每个方法,就像您编写了一个实现接口的“普通”类一样。

匿名类构造让您不必为只在代码中一个非常具体的地方使用的类命名的麻烦。但是,如果您愿意,您可以决定这样做。本质上是一样的——你定义了一个类来实现接口,然后实例化这个类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多