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是扩展对象类。。。但如果我使用接口而不是抽象类…它会给我相同的输出…为什么会这样?因为您创建的任何对象实例,即使它来自实现接口的类,也会从对象扩展。