当前位置: 首页 > 面试题库 >

使用Java中的接口的匿名内部类

彭令秋
2023-03-14
问题内容

因此,当研究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的匿名内部类,而不是直接从第二类代码片段中直接从其实现?


问题答案:

1)为什么我们能够直接从接口创建匿名内部类,而不必通过实现该接口的类创建一个匿名内部类

2)为什么我无法创建实现ActionListener的匿名内部类,而不是直接从第二类代码片段中直接从其实现?

当使用implementsXXXX
创建一个类时,您正在定义一个类(内部或非内部),并且必须给它起一个名字,确定我们可以做到,这就是我们经常做的事情。匿名内部类没有名字,它更像是一个表达式。

我从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对象的语句的一部分。(这解释了为什么在大括号后面有一个分号。)



 类似资料:
  • 问题内容: 据我所知,我们无法实例化接口,那么这是怎么发生的呢? 问题答案: 您无法实例化接口,但是可以为实现该接口的类的对象提供接口的引用,因此在代码中,您正在实现接口并创建该类的对象并提供该类的引用。

  • 问题内容: 如何在我的匿名内部子类中获取传递给此方法的值? 我收到此错误: 无法在以其他方法定义的内部类中引用非最终变量userID 我很确定我不能将其赋值为final,因为它是一个未知值的变量。我听说这种语法确实以某种方式保留了作用域,所以我认为必须有一个我不太了解的语法技巧。 问题答案: 当然,您可以将其分配为final-只需将该关键字放入参数的声明中即可: 我不确定这是一个未知值的变量是什么

  • 问题内容: Java中匿名类的用途是什么?我们可以说使用匿名类是Java的优势之一吗? 问题答案: 使用某些“额外”(例如覆盖方法)创建对象的实例时,匿名内部类会变得很有用,而不必实际继承一个类。 我倾向于将它用作附加事件侦听器的快捷方式: 使用此方法可以使编码更快一些,因为我不需要创建额外的类来实现我可以实例化一个匿名内部类而无需实际创建单独的类。 我仅将这种技术用于“快速而肮脏的”任务,在这些

  • 问题内容: 我正在编写C#Wicket实现,以加深对C#和Wicket的理解。我们遇到的问题之一是Wicket大量使用匿名内部类,而C#没有匿名内部类。 因此,例如,在Wicket中,您可以这样定义一个链接: 由于Link是一个抽象类,因此它强制实现者实现onClick方法。 但是,在C#中,由于没有匿名内部类,因此无法做到这一点。另外,您可以使用如下事件: 当然,这样做有两个缺点。首先,可以有多

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除

  • 在以下片段中: 有没有办法从内部匿名类引用匿名类的外部实例? 第二个错误是在解决方案上,我在这里找到了一个匿名内部类的外部类的关键字。这些问题似乎共享一些概念和问题空间,但性质不同。