2017-03-12 62 views
-1

我有一類叫做A(父)和類B(A的子類)什麼是子類的適當的實例聲明?

我的問題是什麼是下一個行之間的差異:

B b1 = new B(); 
A b2 = new B(); 

我知道,變量和方法B類不能訪問的對象的情況下b2

但它如何在內存中工作?這是什麼意思?何時使用它們中的每一個?

+2

它被稱爲[多態性](https://www.tutorialspoint.com/java/java_polymorphism.htm)。 – Steeve

+0

@steeve謝謝 – Zizoo

回答

1

一個原因使用超類變量類型:

假設你有一個動物類,和幾個子類像大象,老虎,長頸鹿,河馬等

現在你叫另一個類動物園,其中包含一個名爲動物的數組。然後,你可以有:

animals[0] = new Tiger(); 
    anumals[1] = new Elephant(); 

但最好是有聲明,可以擴大或縮小的ArrayList動物:

animals.add(new Tiger()); 
    animals.add(new Elephant()); 
    animals.add(new Hippo()); 

如果子類具有不父的重載的方法方法,你仍然可以通過鑄造它訪問通過超可變子類方法:

Animal a = animals.get(index); 
if (a instanceof Tiger) { 
    ((Tiger)a).tigerMethod(...); 
} 

不就是這種類型的東西可能不是最好的設計,但它說明了這一點。

0

對象可以有多個接口,讓我們說B類從A類繼承: A類可以有5種公共方法, B類已additionaly 5自身的公共方法, 所以在B類你可以看到所有10種方法,而使用A類你只能看到5.

這很重要,因爲這樣你可以控制你給其他程序員使用的類的哪一部分(接口)。

對於egzample:

如果您從公開方法的列表<>,就像回到:

public List<SomeClass> giveMeSomeList() { 
    // both return statements are perfectly valid as return type is List<> 
    return new LinkedList<SomeClass>(); 
    // return new ArrayList<SomeClass>(); 
} 

然後你被允許使用列表<的任何實施>您已經例如。你可以通過你的方法來構造並返回一個ArrayList或者LinkedList <>,但是由於聲明的返回類型是List <>它沒有任何傷害,所以沒有人會依賴於你返回具體的實現(在至少你不負責),只是這將是一種列表<>。但是如果你從你的公共方法返回一個非常具體的類的實現,那麼你給別人邀請使用並且依賴於這個具體的實現,這反過來阻止了方法篡改底層實現而不損害其他代碼的能力。 因此,通過這種方式(使用適當的類型),您可以對其他程序員進行一些限制,以允許他們允許使用哪些方法(界面),並給您一些自由來改變未來的實現 - 例如名單。

當您在方法參數類型中使用接口時,您會使該方法更一般化,因爲它可以與接口(或類型)的任何子類型一起使用。 有時你只需要非常具體的實現作爲你的方法的一個參數,因爲沒有你不能做所需的操作,所以你將依靠非常具體的類型提供給你的方法,並在方法的參數中聲明該類型。

相關問題