【问题标题】:What do curly braces after a 'new' statement do?'new' 语句后的花括号有什么作用?
【发布时间】:2015-04-03 19:56:21
【问题描述】:

我在看this example,想知道第一行是做什么的:

private SiteStreamsListener listener = new SiteStreamsListener() {

看起来您可以以这种方式声明其他方法或覆盖方法。例如,我可以执行以下操作吗?

ArrayList myList = new ArrayList() {
    @Override String toString()
    {
       <my code here>
    }

    <insert new methods here>
}

【问题讨论】:

  • 即使您可以插入新方法,也只有来自ArrayList 的方法是可见的,因为这是对象被声明为的内容
  • 这些大括号是干什么用的,看this post
  • 是接口或抽象类的匿名内部类定义。
  • @RohitJain 我的问题不能简单地由编译器回答,因为编译器不会告诉我大括号的实际功能,只会告诉我代码是否可以编译。我一直在寻找一个答案,比如我接受的那个,它给出了这个实例的术语,以便我可以了解实际发生的事情。总的来说,我觉得从编译器中跳出来的问题通常会由于缺乏理解和实际学习而导致问题:许多学生都会遇到这个问题。
  • @Teofrostus 我说的是你问题的第二部分(这是否可行),而不是第一部分(我在其中链接了一个副本我的第二条评论,只要你看得清楚)。

标签: java


【解决方案1】:

这些花括号定义了一个anonymous inner class

这使您能够覆盖您正在启动的类的publicprotected 方法。您可以对任何非final 类执行此操作,但对于只能以这种方式启动的抽象类和接口最有用。

(为了限定最后一句话,只有一个非default 方法的接口可以使用 Java 8 中的 lambda 语句来启动,绕过这种设计方法。)

【讨论】:

    【解决方案2】:
    ArrayList myList = new ArrayList() {
      @Override 
      String toString()
      {
        //<my code here>
      }
    
      //<insert new methods here>
    }
    

    是的,你可以这样做。您可以大胆地覆盖公共的、受保护的方法。虽然您可以添加新方法,但这些方法无法通过 ArrayList 类的 myList 实例访问。

    更多细节请参考java文档。

    https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html#declaring-anonymous-classes

    【讨论】:

      猜你喜欢
      • 2014-09-09
      • 2017-07-17
      • 1970-01-01
      • 2017-05-11
      • 2013-02-23
      • 1970-01-01
      • 2012-05-03
      • 2023-01-16
      相关资源
      最近更新 更多