1. 程式人生 > >多型的理解(父類引用指向子類物件)

多型的理解(父類引用指向子類物件)

多型:要有繼承,方法的重寫,父類引用指向子類物件           ?疑問: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 介面有什麼好處,這種定義方式就有什麼好處
當然你可以用 ArrayList   list   =   new   ArrayList()
但是一般不這麼用

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

比如,你若希望用LinkedList的實現來替代ArrayList的話,只需改動一行即可:
List   list   =   new   LinkedList();
而程式中的其它部分不需要改動,這樣比較靈活

這個如果你想把儲存結構該為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的物件,這樣你的程式就靈活了。

相關推薦

理解引用指向物件

多型:要有繼承,方法的重寫,父類引用指向子類物件           ?疑問:Animal cat = new Cat(); //向上轉型。        父類引用指向子類物件,該引用不能再訪問子類新

List list = new ArrayList()為何引用指向物件

態:要有繼承,方法的重寫,父類引用指向子類物件 疑問一:父類引用指向子類物件 與指向父類物件 Animal cat = new

引用指向對象時,如何調用的獨有方法?

引用 父類引用 post 父類 多態 pos int ins blog 父類:A 子類:Person A a1 = new Person(); if(a1 instanceof Person) { System.out.println("true");

引用指向對象

static 指向 多繼承 反射機制 board oid 簡單明了 信息 繼承關系 父類引用指向子類對象指的是: 例如父類Animal,子類Cat,Dog。其中Animal可以是類也可以是接口,Cat和Dog是繼承或實現Animal的子類。 Animal animal =

關於引用指向物件

以下內容參考https://www.cnblogs.com/ChrisMurphy/p/5054256.html 父類引用指向子類物件指的是: 例如父類Animal,子類Cat,Dog。其中Animal可以是類也可以是介面,Cat和Dog是繼承或實現Animal的子類。 Animal animal =

關於引用指向對象

不同的 args pac 註意 向上 解決 [] print bstr 以下內容參考https://www.cnblogs.com/ChrisMurphy/p/5054256.html 父類引用指向子類對象指的是: 例如父類Animal,子類Cat,Dog。其中Animal

面向物件三大特徵,super關鍵字,以及引用指向物件。訪問許可權的大小。

一.封裝,反射的時候在詳細補充。 二.繼承 補充:子類的訪問許可權一定要大於等於父類。 訪問許可權的優先順序順序:public(在哪裡都可以訪問)>protected(保護的意思,子類可以訪問,但是子類的許可權要大於父類的許可權,這是首要條件,否者子類依舊訪問不到)

引用指向物件屬性值

父類引用指向子類物件指的是: 例如父類Animal,子類Cat,Dog。其中Animal可以是類也可以是介面,Cat和Dog是繼承或實現Animal的子類。 Animal animal = new Cat(); 即宣告的是父類,實際指向的是子類的一個物件。 那這麼使用的優點是什麼,為什麼要這麼

C#引用指向物件

父類引用指向子類物件指的是: 例如父類Animal,子類Cat,Dog。其中Animal可以是類也可以是介面,Cat和Dog是繼承或實現Animal的子類。 Animal animal = new Cat(); 即宣告的是父類,實際指向的是子類的一個物件。 那這

Java--引用指向的對象詳解!

show 小明 一個 oid void get color system eight 例:   第一步.創建一個Person類 package com.maya.ball; public class Person { private int age; p

JAVA理解包含他人經典例子

引言:理解JAVA多型應先理解JAVA繼承、封裝。 一、什麼是多型 面向物件程式設計有三個特徵,即封裝、繼承和多型。 1. 封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了資料。        2. 繼承是為了重用父類程式碼,同時為實現

c++指標指向物件

c++父類指標指向子類物件   父類子類指標函式呼叫注意事項 1,如果以一個基礎類指標指向一個衍生類物件(派生類物件),那麼經由該指標只能訪問基礎類定義的函式(靜態聯翩) 2,如果以一個衍生類指標指向一個基礎類物件,必須先做強制轉型動作(explicit cast),這種做法很

如何通過引用“呼叫”所獨有的方法

最近看書,看到向上引用的情況:派生類引用或指標轉換為基類引用或指標被稱為向上強制轉換。 BrassPlus dilly("Annie Dill",493222,2000); Brass *pb = &dilly; Brass &rb = dilly;

“全棧2019”Java第五十八章:中方法返回型別可以是型別

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第五十八章:多型中方法返回型別可以是子類型別 下一章 “全棧2019”Java第五十九章:抽

Java之物件使用生活中通俗的例子講解

Java之物件的多型性多型概念 (Java)    多型(英語:polymorphism),是指計算機程式執行時,相同的訊息可能會送給多個不同的類別之物件,而系統可依據物件所屬類別,引發對應類別的方法,而有不同的行為。簡單來說,所謂多型意指相同的訊息給予不同的物件會引發不同的

【C++學習筆記】指標指向物件

        虛擬函式的作用主要是實現了多型的機制。簡而言之就是用父型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。但僅僅可呼叫父類含有的函式,非父類函式不能呼叫。 普通虛擬函式呼叫 假設我們有下面的類層次: #includ

C/C++—— 在建構函式中呼叫虛擬函式能實現Vptr指標初始化的過程分析

問題引入: 比如:如果我們想在父類的建構函式中呼叫虛擬函式,當定義子類物件的時候,父類的建構函式中的虛擬函式執行的是子類中的函式。 在下面的例子中,定義子類物件的時候,在父類建構函式中的print虛擬函式執行的不是子類中的print函式,而是父類中的prin

指標指向物件時的函式呼叫

class A { public: void FuncA() { printf( "FuncA called\n" ); } virtual void FuncB() { printf( "FuncB called\n" ); } }; cl

引用呼叫的方法 反射和轉型

如果父類引用指向子類物件, Class A{} Class B extends A{ public void f(){ } } // A a = new B(); 引用要呼叫子類的方法,那麼有兩種方法: #### 向下轉型

引用對象指向的對象

() exce png hole 虛擬機 end 類對象 -h 類型   在java的多態中,經常會看到父類的引用對象指向子類的對象,一開始很迷茫,因為按照之前所學的知識,父類的引用對象指向自身對象或者子類的引用對象指向自身對象都不難理解,因此為了方便理解,下面舉了一個例子