2012-04-16 39 views
16
SuperClass object = new SubClass(); 

爲什麼要使用超類來實例化一個像上面那樣的子類對象?因爲我學會實例化對象的唯一方法是:使用超類初始化子類對象java

SubClass object = new SubClass(); 

我正在學習java。

回答

13

您可能有一種方法只需要一個SuperClass的實例。由於​​SuperClass,因此您可以使用​​的實例並將其視爲SuperClass。與界面時

同樣的行爲用於:

List someList = new ArrayList(); 

這是多態的美。它允許你在不破壞代碼的其餘部分的情況下更改類內部的實現。

+4

這裏的關鍵一點是,'SubClass' * *是一個'SuperClass'。 – 2012-04-16 15:59:11

+0

在Java 8中這種行爲是否改變了?我只是測試,其中一個方法接受超參數'無效方法(父類PARAM)的情況下'但是我能夠把一個子類的實例'子類子=新的子類();'當我把它稱爲,如'方法(分);'。這意味着現在允許向上兼容? – 2016-12-02 02:16:36

1

您所做的只是告訴JVM編譯時引用的類型。

在第一種情況下,您說對象引用具有超類的靜態類型。當你創建一個新的子類對象時,你可以擁有該引用點,因爲它是一個子類IS-A的超類實例。

4

做前者的主要原因是期望超類的函數調用。如果你有一個類A有這樣

public static void insert(SuperClass b) { 
    //do something 
} 

的方法,你有

SuperClass object = new SubClass(); 

你可以做

A.insert(object); 

但是,如果你

SubClass object new SubClass(); 

你不能做

A.insert(object); 

,除非你喜歡這個方法添加到一個

public static void insert(SubClass b) { 
    //do something 
} 

這可以幫助你減少對多餘的或複製的代碼,並保持清潔的東西。

12

這被稱爲多態性。 想象以下示例:

Musician musician = new Pianist(); 

Musician musician = new Drummer(); 

假設Musician類有一個方法:play()。無論是音樂家是誰,如果你打電話播放方法,你就會知道如何演奏確定的樂器,基於具體的課堂,在這種情況下,無論是鋼琴家還是鼓手。

每個具體類,並覆蓋其play()方法,可以對自己的發揮:

例如爲Pianist類:play() { playsBeethoven(); }

有關詳細信息,請http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

這是一件好事,記得要與繼承http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

0

也就是說你使用繼承的主要原因之一使用它。你對待超類的抽象,並在編譯的時候你不需要知道派生類型,或其他類不需要知道派生類型。這允許您在使用多態性調用派生類的方法時使用對SuperClass的引用。

這使您可以

一)建立工廠,這樣你就不需要知道在編譯時的類型,你必須創建派生類型的一些運行方式。想想COM,GStreamer的,DirectShow的,油腔滑調,等...

灣)僅暴露,即使它們是派生類型的實例的基本類型的引用隱藏的複雜性對其他對象。考慮返回對象或將對象引用作爲參數的方法。

角)更多的可能性,但這些可能是最相關的兩種用法你。