1. 程式人生 > >List list = new ArrayList()為何父類引用指向子類物件(多型)

List list = new ArrayList()為何父類引用指向子類物件(多型)

態:要有繼承,方法的重寫,父類引用指向子類物件

疑問一:父類引用指向子類物件 與指向父類物件
Animal cat = new Cat(); //向上轉型。 
父類引用指向子類物件,該引用不能再訪問子類新增加的成員,那麼這樣和直接new一個父類例項(Animal a = new Animal())有什麼區別?

1、當父類是抽象類或是介面時,不能例項化時,只能運用多型,向上轉型。 
2、普通類中,可以在子類中重寫父類中的方法,這樣就可以訪問子類中的重寫方法。或者:Cat c = (Cat)cat; 向下轉型,再訪問子類中新增加的成員。

Eg: List是介面,ArrayList是List的實現類。

疑問二:父類引用指向子類物件 與子類引用指向子類物件
至於為什麼是寫成List list = new ArrayList()而不是ArrayList arrayList = new ArrayList()有如下的原因:

1.介面的好處
1 介面有什麼好處,這種定義方式就有什麼好處 
當然你可以用 ArrayList list = new ArrayList() 
但是一般不這麼用

2.改動小
2 設計模式中有對依賴倒置原則。程式要儘量依賴於抽象,不依賴於具體。 
從Java語法上,這種方式是使用介面引用指向具體實現。

比如,你若希望用LinkedList的實現來替代ArrayList的話,只需改動一行即可:

List   list   =   new   LinkedList();
1
而程式中的其它部分不需要改動,這樣比較靈活

這個如果你想把儲存結構改為LinkedList的時候,只要把List list = new ArrayList()改為list = new LinkedList()而其他的所有的都不需要改動。這也是一種很好的設計模式.一個介面有多種實現,當你想換一種實現方式時,你需要做的改動很小.

假設你開始用 ArrayList alist = new ArrayList(), 這下你有的改了,特別是如果你使用了 ArrayList 特有的方法和屬性。 ,如果沒有特別需求的話,最好使用List list = new LinkedList(); ,便於程式程式碼的重構. 這就是面向介面程式設計的好處

3.面向介面程式設計
4.提高程式寬展性,以後修改維護好些
詳細解釋: 
ArrayList不是繼承List介面,是實現了List介面。 
你寫成ArrayList arrayList = new ArrayList();這樣不會有任何問題。和List list = new ArrayList();相比這2個寫是有區別的。arrayList是一個ArrayList物件,它可以使用ArrayList的所有方法。 
List是介面,它是不可以被例項化的(介面是個抽象類),所以必須以它的實現類去例項化它。list物件雖然也是被例項化為ArrayList但是它實際是List物件,list只能使用ArrayList中已經實現了的List介面中的方法,ArrayList中那些自己的、沒有在List介面定義的方法是不可以被訪問到的。 
我們說,用介面去做是有它的好處的,如果你把型別定義成ArrayList(也就是一個具體的實現類)那麼你就只能接收這一種型別的資料了,如果你要是定義為List那麼你不僅可以接收ArrayList的物件還可以接收LinkedList的物件,這樣你的程式就靈活了。
--------------------- 
作者:Jae_Peng 
來源:CSDN 
原文:https://blog.csdn.net/Jae_Peng/article/details/80151033 
版權宣告:本文為博主原創文章,轉載請