2011-04-14 63 views
11

下面我有一個Person接口,一個實現類和一個驅動程序類,它用一個名字初始化Person並只輸出一次。什麼是使用接口與具體類

Person person = new PersonImpl(); 

,而不是

PersonImpl person = new PersonImpl(); 

的接口應該被隱藏實現的優勢在哪裏? 這是使用接口的正確方法嗎?

public class Driver { 

    public static void main(String [] args) 
    { 
     Person person = new PersonImpl(); 
     person.setName("test name"); 
     System.out.println("Name is "+person.getName()); 
    } 

} 


public interface Person { 

    public void setName(String name); 

    public String getName(); 

} 


public class PersonImpl implements Person{ 

    private String name; 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

是的,它是好工作。 – 2011-04-14 23:01:32

+1

謝謝,但我認爲我不完全理解它,也許即時沒有看到更大的圖片爲什麼不只是使用 - PersonImpl person = new PersonImpl(); person.setName 「test name」); System.out.println(「Name is」+ person.getName()); – user701254 2011-04-14 23:03:35

+0

當然,如果你期望只有一種類型的人你根本不需要接口;你可以直接實現一個Person類。對於在*相同子系統或模塊*中的代碼尤其如此。通常建議爲其他軟件包可見的類定義一個接口。 – 2013-08-14 22:33:16

回答

10

這是使用接口的方式。

原因是你可以在不改變使用Person的代碼的情況下編寫另一個實現。

因此,現在您可以使用PersonImpl但稍後您可能需要OtherTypeOfPersonImpl

您可以創建實現相同接口的新類,並且可以使用新類以及任何其他預期爲Person的代碼。

一個很好的例子是List接口。

List有多種實現方式,如ArrayList,LinkedList等。這些都有優點和缺點。通過編寫使用List的代碼,您可以讓每個開發人員決定哪種類型的List最適合他們,並且能夠在不做任何更改的情況下處理它們中的任何一個。

+0

即時通訊有點困惑。我爲什麼要創建另一種類型的人。好吧,我認爲我在學習時會輸入。這是因爲,例如getName我可以在返回它之前修改字符串名稱或類似的東西? – user701254 2011-04-14 23:21:05

+1

的確,您可能希望有兩種'Person','Child'和'Adult',其中'Child'只是返回他們的名字,而'Adult'返回名稱前面帶有標題的名字(Person先生)。我在回答爲什麼這很有用的問題上增加了一個更好的例子。 – 2011-04-14 23:39:04

4

你做的是正確的。使用Person person = new PersonImpl()的優點在於接口和具體實現之間保持鬆散耦合。 PersonImpl person = new PersonImpl()緊密耦合。而Person person = new Person()甚至不會編譯。

想象你有一個巨大的應用程序,並且很多代碼取決於PersonImpl對象。現在假設我想更改PersonImpl並創建一個新類PersonImpl2。現在我必須手動掃描整個項目並隨處進行更改。這甚至可能會破壞代碼。這被稱爲緊耦合,並且是一件壞事。相反,如果代碼的其餘部分依賴於Person對象,那麼即使我創建了一個新的PersonImpl2類,事情也可以正常工作,因爲PersonImpl2實現了Person。

2

我能想到的一個優點是,你可能有兩種不同類型的人,但你想等到運行時(基於用戶輸入,配置文件等)決定使用哪一種。你可以這樣做:

Person person = null; 
if ... 
    person = new PersonImpl(); 
else 
    person = new PersonImpl2(); 
0

使用接口而不是具體的類會讓你稍後改變實現。

關於JDBC,它全部基於接口,所以驅動程序可以在以後實現。

例如,當你使用ResulSet時,你並不關心底層實現是如何或者什麼的(使用Oracle驅動程序就像OracleResultSet,MySQL驅動程序可能類似於MySQLResultSet),但你知道什麼方法是可供您使用。

同去與列表或地圖,而不是ArrayList的或HashMap的

2

這取決於你想如何使用人。

就目前來看,你不能從它的界面中獲得任何真正的好處。

但是,假設有外星人因爲他們的行爲而被認爲是「人」(比如說在人中定義的會話(),散步(),認爲(),感覺())。可能希望將「人」從「人」和「外星人」中分離出來,以便來自兩個截然不同的等級的個體 - 「哺乳動物」等級中的「人」和「蜘蛛綱」等級中的「外星人」人的界面。