2011-04-04 196 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.