【问题标题】:Anonymous inner class using an interface in Java在 Java 中使用接口的匿名内部类
【发布时间】:2014-12-22 06:46:07
【问题描述】:

因此,在研究 lambda 表达式并使用它们来替换 Java 中的 EventHandlers 的匿名内部类时,我遇到了一些让我停下来思考的匿名内部类。例如,当为通常实现 ActionListener 的东西编写匿名内部类时,我们编写

myJButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e){
        //DO SOMETHING
    }
});

我对此感到困惑的是,ActionListener 是一个接口,所以我认为有必要做一些类似...

myJButton.addActionListener(new myButtonListener implements ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e){
        //DO SOMETHING
    }
});

但这甚至无法编译。我想我认为这显然是因为如果我们使用私有内部类,我们使用

private MyButtonListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        //DO SOMETHING
    }
}
myJButton.addActionListener(new MyButtonListener());

所以我的问题是:

1) 为什么我们可以直接从接口创建匿名内部类,而不必通过实现该接口的类来创建?

2) 为什么我无法创建一个实现 ActionListener 的匿名内部类,而不是像我在第二个代码 sn-p 中显示的那样直接从它实现?

【问题讨论】:

  • 你认为这里的 anonymous 是什么意思?

标签: java inheritance interface anonymous-inner-class


【解决方案1】:

1) 为什么我们能够直接从一个 接口,而不是必须通过一个类来创建一个 实现接口?

2) 为什么我无法创建一个匿名内部类来实现 ActionListener 而不是直接来自它,如我在第二个代码中所示 sn-p?

当你使用implements XXXX 创建一个类时,你定义了一个类(内部或非内部),你必须给它一个名字,当然我们可以这样做,这也是我们经常做的。而匿名内部类没有名字,更像是一个表达式。


我从http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html复制这个

我认为这将帮助您了解匿名类是什么。

匿名类是一个表达式。它们就像本地类,只是它们没有名称

。匿名类表达式的语法类似于构造函数的调用,只不过代码块中包含了类定义。

考虑 frenchGreeting 对象的实例化:

    HelloWorld frenchGreeting = new HelloWorld() {
        String name = "tout le monde";
        public void greet() {
            greetSomeone("tout le monde");
        }
        public void greetSomeone(String someone) {
            name = someone;
            System.out.println("Salut " + name);
        }
    };

匿名类表达式包含以下内容:

  • 新的运算符

  • 要实现的接口或要扩展的类的名称。在本例中,匿名类实现了 HelloWorld 接口。

  • 包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:实现接口时,没有构造函数,所以使用一对空括号,如本例所示。

  • 一个主体,它是一个类声明主体。更具体地说,在正文中,允许声明方法,但不允许声明。

因为匿名类定义是一个表达式,所以它必须是语句的一部分。在此示例中,匿名类表达式是实例化 frenchGreeting 对象的语句的一部分。 (这就解释了为什么右大括号后面有一个分号。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多