Java超越了怀疑

时间:2011-04-04 17:54:17

标签: java

在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”作为输出。

3 个答案:

答案 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子类,并覆盖BazzBar。实际上,你会说它会覆盖Bar.myMethod,因为虽然在这个例子中我们知道Foo.anotherMethod没有实现Bar.anotherMethod,但在现实世界中你不会知道并且不会'关心它是否做到了。您只是知道班级Bar的方法为anotherMethod

答案 2 :(得分:0)

我会说两者,但你实际上没有实现这个接口......接口是一个纯粹的抽象类,因此它的所有方法都没有实现......所以你提供了一个实现,它是可见的两者作为接口方法实现(所以你可以引用它参考接口)以及它被覆盖的对象的toString()...