我有一類叫做A
(父)和類B
(A的子類)什麼是子類的適當的實例聲明?
我的問題是什麼是下一個行之間的差異:
B b1 = new B();
A b2 = new B();
我知道,變量和方法B類不能訪問的對象的情況下b2
但它如何在內存中工作?這是什麼意思?何時使用它們中的每一個?
我有一類叫做A
(父)和類B
(A的子類)什麼是子類的適當的實例聲明?
我的問題是什麼是下一個行之間的差異:
B b1 = new B();
A b2 = new B();
我知道,變量和方法B類不能訪問的對象的情況下b2
但它如何在內存中工作?這是什麼意思?何時使用它們中的每一個?
一個原因使用超類變量類型:
假設你有一個動物類,和幾個子類像大象,老虎,長頸鹿,河馬等
現在你叫另一個類動物園,其中包含一個名爲動物的數組。然後,你可以有:
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(...);
}
不就是這種類型的東西可能不是最好的設計,但它說明了這一點。
對象可以有多個接口,讓我們說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 <>它沒有任何傷害,所以沒有人會依賴於你返回具體的實現(在至少你不負責),只是這將是一種列表<>。但是如果你從你的公共方法返回一個非常具體的類的實現,那麼你給別人邀請使用並且依賴於這個具體的實現,這反過來阻止了方法篡改底層實現而不損害其他代碼的能力。 因此,通過這種方式(使用適當的類型),您可以對其他程序員進行一些限制,以允許他們允許使用哪些方法(界面),並給您一些自由來改變未來的實現 - 例如名單。
當您在方法參數類型中使用接口時,您會使該方法更一般化,因爲它可以與接口(或類型)的任何子類型一起使用。 有時你只需要非常具體的實現作爲你的方法的一個參數,因爲沒有你不能做所需的操作,所以你將依靠非常具體的類型提供給你的方法,並在方法的參數中聲明該類型。
它被稱爲[多態性](https://www.tutorialspoint.com/java/java_polymorphism.htm)。 – Steeve
@steeve謝謝 – Zizoo