在main方法的以下程序中,实现接口的匿名类 TestInt被实例化并打印。
在打印任何对象时,将调用其类的toString方法。但是类Foo也扩展了Object,它有一个公共String toString()方法,testInt接口也是如此。那么我们主要覆盖哪个功能?一个来自Object还是一个来自TestInt?
interface TestInt{ String toString(); }
public class Foo {
public static void main(String[] args) {
System.out.println(new TestInt() {
public String toString() { return "foo"; }
});
}
}
上面的程序编译并运行正常并生成“foo”作为输出。
答案 0 :(得分:7)
您覆盖 Object#toString()
和实施 TestInt#toString()
。但这是一个非常挑剔的区别。由于这些方法具有相同的签名,因此它们在所有实际用途中都是相同的。
答案 1 :(得分:1)
您正在实施TestInt
的{{1}}方法并覆盖toString()
的{{1}}方法。 Object
接口规定任何实现它的类还必须实现您可能不必执行的toString
方法,因为本质上是您已经实现的TestInt
的子类。要记住的一件重要事情是继承是一种层次结构。如果您的父实现了一个方法,并且您实现了具有相同签名的方法,那么您将覆盖您的父方法。如果您的父母碰巧覆盖其父母等等并不重要。但是,您可以覆盖父母选择不覆盖的祖父母的方法。例如,
toString()
在这种情况下,Object
子类public class Foo{
public void myMethod(){
System.out.println("Foo.myMethod");
}
public void anotherMethod(){
System.out.println("Foo.anotherMethod");
}
}
public class Bar extends Foo{
public void myMethod(){
System.out.println("Bar.myMethod");
}
}
public class Bazz extends Bar{
public void myMethod(){
System.out.println("Bazz.myMethod");
}
public void anotherMethod(){
System.out.println("Bazz.anotherMethod");
}
}
并覆盖Bar
方法,但不会覆盖Foo
方法。 Foo.myMethod
依次为Foo.anotherMethod
子类,并覆盖Bazz
和Bar
。实际上,你会说它会覆盖Bar.myMethod
,因为虽然在这个例子中我们知道Foo.anotherMethod
没有实现Bar.anotherMethod
,但在现实世界中你不会知道并且不会'关心它是否做到了。您只是知道班级Bar
的方法为anotherMethod
答案 2 :(得分:0)
我会说两者,但你实际上没有实现这个接口......接口是一个纯粹的抽象类,因此它的所有方法都没有实现......所以你提供了一个实现,它是可见的两者作为接口方法实现(所以你可以引用它参考接口)以及它被覆盖的对象的toString()...