Java a';新';你怎么做?

Java a';新';你怎么做?,java,Java,我在看,想知道第一行是做什么的: private SiteStreamsListener listener = new SiteStreamsListener() { 看起来您可以以这种方式声明其他方法或重写方法。例如,我可以做以下几点吗 ArrayList myList = new ArrayList() { @Override String toString() { <my code here> } <insert new

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

private SiteStreamsListener listener = new SiteStreamsListener() {
看起来您可以以这种方式声明其他方法或重写方法。例如,我可以做以下几点吗

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

    <insert new methods here>
}
ArrayList myList=new ArrayList(){
@重写字符串toString()
{
}
}

这些花括号定义了

这允许您能够覆盖您正在初始化的类的
public
protected
方法。您可以对任何非final类执行此操作,但对抽象类和接口最有用,抽象类和接口只能通过这种方式启动

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

ArrayList myList=new ArrayList(){
@凌驾
字符串toString()
{
//
}
//
}
是的,你能做到。您可以挑战性地覆盖公共的、受保护的方法。虽然可以添加新方法,但这些方法将无法通过ArrayList类的myList实例访问

有关更多详细信息,请参阅java文档


即使可以插入新方法,也只能看到
ArrayList
中的方法,因为这就是对象声明的内容以及这些大括号的用途,请查看它是接口或抽象类的匿名内部类定义。@RohitJain我的问题不能简单地由编译器回答,因为编译器不会告诉我大括号的实际功能,只会告诉我代码是否可以编译。我在寻找一个答案,比如我接受的答案,它给出了这个例子的术语,这样我就可以了解实际发生的事情。总的来说,我觉得从编译器上蹦跳出来的问题通常会由于缺乏理解和实际学习而导致问题:这是一个许多学生都会遇到的问题。@Teofrostus我刚才说的是你问题的第二部分(这是否可行),而不是第一部分(如果你看得清楚的话,我在第二条评论中链接了一个副本)。
ArrayList myList = new ArrayList() {
  @Override 
  String toString()
  {
    //<my code here>
  }

  //<insert new methods here>
}