Java 有人能解释一下下面代码的工作原理吗。。。?

Java 有人能解释一下下面代码的工作原理吗。。。?,java,interface,abstract-class,anonymous-class,Java,Interface,Abstract Class,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 myIn

有人能解释一下下面代码的工作原理吗

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";}});
    }
}
输出是

myInterfacetoString
primitivedemo.Main$2@9304b1
所有答案都表明println()语句中的myInterface是匿名类。但既然我已经声明它是一个接口,为什么它允许我创建同名的匿名类


同样,如果这些是匿名类,那么class main应该允许我为这些匿名类指定任何名称。但是如果尝试这样做。当您打印出一个对象时,我得到编译错误,它将调用toString()方法。在第一条语句中,创建新对象并重写名为toString的方法。因此,在打印对象时调用这个toString()方法

在第二条语句中,您还创建了一个对象,但没有重写toString()方法,以便它使用object类的toString()方法

对于新问题,此链接对您的理解有很好的解释:

以下是解释的副本:

new className(optional argument list){classBody}
此表达式从一个未命名和以前未定义的类实例化一个新对象,自动扩展名为className的类,,并且无法显式实现任何接口。新类的主体由classBody给出

执行此表达式的结果是定义了扩展className的新类,实例化了新类的新对象,并用对新对象的引用替换了表达式

new interfaceName(){classBody}
此表达式从一个未命名和以前未定义的类中实例化一个新对象,该类自动实现名为interfaceName的接口,并自动扩展名为object的类。类可以显式地实现一个接口,只能实现一个接口,不能扩展对象以外的任何类。同样,新类的主体由classBody给出

您现在清楚了吗?

在第一个
println()
实例中,您正在重写匿名
myAbstractClass
实例中的
toString()
方法,因此您将得到被重写的
toString()
方法返回的字符串,这是
println()
函数的默认行为

在第二个
println()

另一方面,请尝试正确格式化您的代码,这样更易于阅读和理解

abstract class myAbstractClass{}

public class Main { 
    public static void main(String[] args) { 
        System.out.println(new myAbstractClass(){
            public String toString(){
                return "myAbstractClass toString";
            }
        });

        System.out.println(new myAbstractClass(){
            public String myFunction(){
                return "myAbstractClass myFunction";
            }
        }); 
    } 
}

myAbstractClass是一个最小类。它继承自对象

Class main从myAbstractClass构造两个匿名内部类,并打印它们的toString输出

  • 内部类重写toString方法,您可以看到它的输出
  • 内部类添加了一个方法,您可以使用默认的toString定义

  • 在这两种情况下,您都打印了对象。因此,它将调用对象的
    toString()
    方法。在第一个场景中,由于您已经重写了
    toString()
    方法,因此它正在打印
    myAbstractClass toString
    。在第二个场景中,由于未重写它,因此它调用在
    对象
    类中实现的默认
    toString()


    我认为您期望在第二个场景中调用函数,这是错误的。您刚刚覆盖了它,但从未打过电话。

    这是家庭作业还是好奇心?在作业问题上加上这样的标签被认为是一种很好的形式。但是,我建议你不要经常用新的内容来改变问题。相反,你可以提交一个新问题,并在其中引用这个问题。这是使一个匿名类的实例实现一个空接口。其中一个会覆盖toString(),因此System.out.println将自动使用它。另一个有myFunction,它没有被调用,所以它使用对象的toString(),它提供了一些信息,包括对象的地址。。。。但我还是很困惑。。。bcoz我不明白为什么它被视为匿名类?对我来说,这似乎是实例化接口或抽象类。。。这与我对抽象类和接口的理解相矛盾。我已经编辑了我的答案,以便对接口的匿名类有一个新的、更清晰的解释。你也应该看看这个链接,它真的很好:)好的。。。但这会调用toString方法,因为默认情况下myAbstractClass是扩展对象类。。。但如果我使用接口而不是抽象类…它会给我相同的输出…为什么会这样?所有对象直接或间接、显式或隐式扩展对象类。如果您使用接口而不是抽象类,那么您的匿名类仍然会隐式扩展对象。你也应该看看这个链接,它真的很好:)也许是因为你是新来的,不知道规则。但是你可以接受答案好的。。。但这会调用toString方法,因为默认情况下myAbstractClass是扩展对象类。。。但如果我使用接口而不是抽象类…它会给我相同的输出…为什么会这样?因为您创建的任何对象实例,即使它来自实现接口的类,也会从对象扩展。