2011-04-04 171 views
0

在主要方法中的以下程序中实现了一个匿名类,该类实现了接口 TestInt被实例化和打印。Java override怀疑

在打印任何对象时,调用其类的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

恩你是不是试图在这里实例化一个接口?这段代码实际上工作吗? – 2011-04-04 17:57:32

+0

@Richard它正在实例化一个实现TestInt的匿名内部类。 – 2011-04-04 17:58:39

+0

@Richard:我不是一个Java人,但我相信上面的代码是有效的:他正在实例化一个实现TestInt的* anonymous *类。 – rsenna 2011-04-04 17:59:55

回答

7

覆盖Object#toString()实施TestInt#toString()。但这是一个非常挑剔的区别。由于这些方法具有相同的签名,它们对于所有实际用途都是相同的。

0

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

1

要实现TestInttoString()方法和压倒一切的ObjecttoString方法。 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"); 
    } 
} 

在这种情况下,子类BarFoo覆盖Foo.myMethod方法,但不会覆盖Foo.anotherMethod方法。 Bazz依次是小类Bar并且覆盖Bar.myMethodFoo.anotherMethod。在现实中,你会说它覆盖了Bar.anotherMethod,因为虽然在这种情况下我们知道Bar没有实现anotherMethod,但在现实世界中,你不会知道它是否做到了。你只知道类Bar有方法anotherMethod.