2011-09-26 49 views
2
interface Device 
{ 
    public void doIt(); 
} 

public class Electronic implements Device 
{ 
    public void doIt() 
    { 
    } 
} 

abstract class Phone1 extends Electronic 
{ 
} 
abstract class Phone2 extends Electronic 
{ 
    public void doIt(int x) 
    { 
    } 
} 

class Phone3 extends Electronic implements Device 
{ 
    public void doStuff() 
    { 
    } 
} 

任何人都可以告訴我爲什麼編譯..因爲「Phone3」實現設備,它應該有doIt()方法,但它沒有。但是這仍然編譯。我可以知道Y嗎?在Java界面實現的疑問

+9

14個問題,沒有被接受的答案? :( –

回答

2

implements Device在類別Phone3定義中是多餘的。該類繼承Electronic類實現Device接口的事實。

也就是說,每個延伸的類Electronic也在執行Device,並且也在繼承Electronic提供的doIt的實現。它們中的每一個都可以通過覆蓋它來擴展/提供不同的實現doIt

6

Phone3延伸ElectronicElectronic具有方法doIt(),實現Device接口。因此doIt方法的實現只是從Electronic基類繼承而來。

如果你讓這個例子更真實一些,這是有道理的。使用ring方法將Device更改爲Ringable。創建一個實現Ringable的基類SimplePhone,並執行ring方法。並將SimplePhone的子類稱爲BeautifulPinkPhone。美麗的粉紅色手機將能夠響鈴,因爲它只是一個粉紅色的簡單電話。

1

這是因爲Phone3擴展電子電器已經實現了doIt()方法。

1

它有效,因爲Electronic實施Device。你有沒有嘗試在主類中的接口實現編譯?

+0

不..但是我明白了它編譯得非常感謝 –

0

Phone3延伸Electronic,其已經實現了doIt

1

Phone3Electronic類繼承它。

0

原因Phone3還擴展了電子產品,該產品具有doIt方法的空白實現。
所以它不需要擁有它,除非它需要重寫行爲。

1

Phone3擴展了Electronic並繼承了它的所有方法。由於Electronic有一個doIt()方法可以編譯。

1

Phone3擴展Electronic因此它繼承doIt()方法

1

如果您在上面的代碼中看到,電話3已經實施doIt方法()在繼承樹方法 ,即在電子類,如果你想 在你的Phone3類中調用doIt()方法會很好地工作,例如。

class Phone3 extends Electronic implements Device 
{ 
public void doStuff() 
{ 

} 
public static void main(String...args) 
{ 
    Phone3 p3=new Phone3(); 
    p3.doIt(); 
} 
} 
+0

@sai sindhu,如​​果從你的Electronic類中刪除implements Device,那麼它也可以工作,因爲Device接口內部存在的方法與你在Electronic clas中定義的方法相同 – subodh