2011-10-10 44 views
1

我正試圖掌握接口及其在Java中的實現。使用實現對象分配

我有一個接口和3個類,其中2個實現接口。接口的實現需要2種方法,

  • toString()[其在此處使用@Overide爲Netbeans的滿意]
  • wheelCount()

    公共接口IVehicle {
    @覆蓋 公共字符串的ToString(); public int wheelCount();
    }

然後,我們有兩個類自行車和汽車。

public class Bike implements IVehicle{ 
    @Override 
    public int wheelCount() { 
     return 2; 
    } 
    @Override 
    public String toString(){ 
     String s = "This is a Bike with " + wheelCount() + " wheels!"; 
     return s; 
    } 
} 

public class Car implements IVehicle{ 
    @Override 
    public int wheelCount() { 
     return 4; 
    } 
    @Override 
    public String toString(){ 
     String s = "This is a Car with " + wheelCount() + " wheels!"; 
     return s; 
    } 
}  

一些所謂myClass其他類包含了要打印的東西出來的方法...... printStuf()

public void prntStuf(IVehicle myVehicle){ 
    String s = myVehicle.toString(); 
    System.out.println(s); 
} 

假設myClass一個實例中,我們創建的Bike()Car()實例代碼創建的,如果一個地方,並且我們將這些對象傳遞給方法prntStuf,那麼使用這些任務中的哪一個會有什麼好處。

IVehicle X =新車()

IVehicle modeoftransport1 = new Car(); 
    IVehicle modeoftransport2 = new Bike(); 

與之相對...車X =新車()

Car modeoftransport1 = new Car(); 
    Bike modeoftransport2 = new Bike(); 

是否有實際差別還是收益,還是歸結爲編碼慣例?

從我所知道的來看,它們都具有相同的效果,因爲它們都產生相同的結果。我已經瀏覽了此處的以前的問題,並搜索了網頁,但無法把它指向它。希望這是有道理的。

+0

可能的重複[爲什麼你會聲明一個接口,然後在Java中使用它實例化一個對象?](http://stackoverflow.com/questions/7716435/why-would-you-declare-an-interface-and - 然後實例化一個對象與它在java中) – MAK

+0

@MAK這是我的朋友,沒有意識到他也發佈了這個問題。是否可以合併或刪除這個? – AJQShake

回答

2

在你的例子中,變量的類型並不重要。

類型的選擇實際上是關於稍後您將如何處理變量的選擇。當你說:

Car modeoftransport1 = new Car(); 

你說「我將要處理的方式新車真正重要的事情,它是一個汽車」;例如,如果Car有其他一些特定於汽車的方法,也許你會打電話給那些人。當你說:

IVehicle modeoftransport1 = new Car(); 

你在說「我將以一種無論它是什麼樣的車輛的方式來處理新車」。

所以,很大程度上是編碼約定或編碼風格。

+1

好吧,如果我在車裏有一個叫做beep()的方法,並且想稍後調用它,是的,我可以明白爲什麼我會使用前者。我現在得到這個部分,因爲前一個對象可以訪問beep(),而後者只能訪問該接口指定的方法。但爲什麼要使用後者呢?爲什麼它會有所作爲? – AJQShake

+1

因爲您可能想說「我絕對不會想要在此上調用蜂鳴聲()」。這可能聽起來很愚蠢,但是當你使用大型系統時,忽略細節的能力與捕捉細節的能力一樣有用。你是否熟悉豪爾赫路易斯博爾赫斯?你可能喜歡閱讀[Funes the Memorious](http://evans-experientialism.freewebspace.com/borges.htm)。 –

+0

@Tom我一直在尋找這個問題的合理答案,我認爲你已經完美地回答了。您的評論可能是最有幫助的,謝謝。 – CSharper

-1

在這些陳述中沒有關係,並被認爲是使用後者的不良做法。

0

在這種情況下,它們是相同的。如果您在任何一個派生類中都有特定的功能,那麼如果您想在稍後的處理中調用該功能(如果不在範圍內),則需要使用後者。

+0

實際上即使沒有任何特殊功能也是有區別的。函數重載根據對象的靜態類型來解析。 – Voo

+0

感謝您補充說明。我會在我的解釋中包含特定功能的重載。 – smp7d