任何人都可以解释以下代码的工作吗?

Sid*_*dhi 6 java abstract-class interface anonymous-class

任何人都可以解释以下代码的工作吗?

interface myInterface{}

public class Main {

    public static void main(String[] args) {

        System.out.println(new myInterface(){public String toString(){return "myInterfacetoString";}});

        System.out.println(new myInterface(){public String myFunction(){return "myInterfacemyFunction";}});
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是......

myInterfacetoString
primitivedemo.Main$2@9304b1
Run Code Online (Sandbox Code Playgroud)

所有答案都说println()语句中的myInterface是匿名类.但是因为我已经将它声明为接口,为什么它允许我创建同名的匿名类....?

再次...如果这些是匿名类,那么class main应该允许我给这些匿名类赋予任何名称..但是如果尝试这样做..我得到编译错误

vod*_*ang 14

打印出一个对象时,它将调用toString()方法.在第一个语句中,您创建了新对象,并且还覆盖了名为toString的方法.因此,在打印对象时调用此toString()方法.

在第二个语句中,您还创建了一个对象,但是您没有覆盖toString()方法,因此它将使用Object类的toString()方法.

对于新问题,此链接对您的理解有一个很好的解释: 匿名类

以下是解释的副本:

new className(optional argument list){classBody}
Run Code Online (Sandbox Code Playgroud)

这表情从一位不愿透露姓名和以前未定义类,实例化一个新的对象自动扩展名为类名的类,并且不能明确地实现任何接口.新类的主体由classBody给出.

执行此表达式的结果是定义了一个扩展className 的新类,实例化了新类新对象,并且该表达式被对新对象的引用所取代.

new interfaceName(){classBody}
Run Code Online (Sandbox Code Playgroud)

此表达式实例化一个新的对象从一个未命名和先前未定义类,它可以自动实现名为接口名的接口,并自动扩展的类名为对象.该类可以显式实现一个,只有一个接口,并且不能扩展除Object之外的任何类.同样,新类的主体由classBody给出.

你现在明白了吗?

  • 所有对象直接或间接,显式或隐含扩展Object类.如果使用接口而不是抽象类,那么您的匿名类仍将隐式扩展Object. (2认同)