態:要有繼承,方法的重寫,父類引用指向子類對象編程
疑問一:父類引用指向子類對象 與指向父類對象
Animal cat = new Cat(); //向上轉型。
父類引用指向子類對象,該引用不能再訪問子類新增長的成員,那麼這樣和直接new一個父類實例(Animal a = new Animal())有什麼區別?設計模式
一、當父類是抽象類或是接口時,不能實例化時,只能運用多態,向上轉型。
二、普通類中,能夠在子類中重寫父類中的方法,這樣就能夠訪問子類中的重寫方法。或者:Cat c = (Cat)cat; 向下轉型,再訪問子類中新增長的成員。.net
Eg: List是接口,ArrayList是List的實現類。設計
疑問二:父類引用指向子類對象 與子類引用指向子類對象
至於爲何是寫成List list = new ArrayList()而不是ArrayList arrayList = new ArrayList()有以下的緣由:對象
1.接口的好處
1 接口有什麼好處,這種定義方式就有什麼好處
固然你能夠用 ArrayList list = new ArrayList()
可是通常不這麼用blog
2.改動小
2 設計模式中有對依賴倒置原則。程序要儘可能依賴於抽象,不依賴於具體。
從Java語法上,這種方式是使用接口引用指向具體實現。繼承
好比,你若但願用LinkedList的實現來替代ArrayList的話,只需改動一行便可:接口
List list = new LinkedList();
1
而程序中的其它部分不須要改動,這樣比較靈活重構
這個若是你想把存儲結構改成LinkedList的時候,只要把List list = new ArrayList()改成list = new LinkedList()而其餘的全部的都不須要改動。這也是一種很好的設計模式.一個接口有多種實現,當你想換一種實現方式時,你須要作的改動很小.List
假設你開始用 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 版權聲明:本文爲博主原創文章,轉載請附上博文連接!