java中多型的理解——父類引用指向子類物件
java多型,如何理解父類引用指向子類物件
要理解多型性,首先要知道什麼是“向上轉型”。
我定義了一個子類Cat,它繼承了Animal類,那麼後者就是前者是父類。
我可以透過 Cat c = new Cat(); 例項化一個Cat的物件,這個不難理解。 但當我這樣定義時: Animal a = new Cat(); 表示定義了一個Animal型別的引用,指向新建的Cat型別的物件。由於Cat是繼承自它的父類Animal,所以Animal型別的引用是可以指向Cat型別的物件的。
那麼這樣做有什麼意義呢?因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特, 定義一個父類型別的引用指向一個子類的物件既可以使用子類強大的功能,又可以抽取父類的共性。
所以,父類型別的引用可以呼叫父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,它是無可奈何的; 同時,父類中的一個方法只有在父類中定義而在子類中沒有重寫的情況下,才可以被父類型別的引用呼叫; 對於父類中定義的方法,如果子類中重寫了該方法,那麼父類型別的引用將會呼叫子類中的這個方法,這就是動態連線。也可以叫做動態繫結。
動態繫結是指”在執行期間(而非編譯期間)“判斷所引用物件的實際型別,根據實際的型別呼叫其相應的方法。
class Father{
Public void func1(){
Func2();
}
Public void fun2(){
System.out.println("AAA");
}
}
Class Child extends Father{
//func1(int i)是對父類func1()方法的一個過載,主要不是重寫!
Public void func1(int i){
System.out.println("BBB");
}
//func2()重寫了父類Father中的func2()方法
//如果父類型別的引用中呼叫了func2()方法,那麼必然是子類中重寫的這個方法
Public void func2(){
System.out.println("CCC");
}
}
Public class Test{
Public static void mian(String [ ]args){
Father child= new Child();
child.func1();//列印結果將會是什麼?
child.func1(89);//?該方法會怎樣呢?
}
}
上面的程式是個很典型的多型的例子。子類Child繼承了父類Father,並過載了父類的func1()方法,重寫了父類的func2()方法。過載後的func1(inti)和func1()不再是同一個方法,由於父類中沒有func1(int i),那麼,父類型別的引用child就不能呼叫func1(inti)方法。而子類重寫了func2()方法,那麼父類型別的引用child在呼叫該方法時將會呼叫子類中重寫的func2()。
那麼該程式將會列印出什麼樣的結果呢?很顯然,應該是“CCC”。
其實是多型的應用,體現在以下幾點:
使用父類型別的引用指向子類的物件
該引用只能呼叫父類中定義的方法和變數
如果子類中重寫了父類中的一個方法,那麼在呼叫這個方法的時候,將會呼叫子類中的這個方法;(動態連線、動態呼叫)
變數不能被重寫(覆蓋),”重寫“的概念只針對方法,如果在子類中”重寫“了父類中的變數,那麼在編譯時會報錯。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/151/viewspace-2808206/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java 中建立子類物件會建立父類物件麼?Java物件
- C++父類指標指向子類物件的實現原理C++指標物件
- 鏈式-父類中返回子類物件物件
- JAVA 將介面的引用指向實現類的物件Java物件
- java中父類宣告子類例項化Java
- 如何理解Python3中的子類和父類?Python
- 子父類中函式函式
- 類的繼承_子類繼承父類繼承
- 理解Java中物件基礎Object類Java物件Object
- day-25-類的繼承順序-父類對子類的約束-多型-佇列和棧繼承多型佇列
- 理解類引用這種型別 (轉)型別
- 子父類中成員變數變數
- java學習中對類和物件的理解Java物件
- Java中的類繼承與多型Java繼承多型
- Java子類和父類的初始化執行順序Java
- C# 繼承 子類(派生類) 父類(基類)C#繼承
- 關於CSS中的定位使用子絕父相(子類絕對位置和父類相對位置)CSS
- java關於繼承父類,需要實現父類中的構造方法Java繼承構造方法
- java中的類與物件Java物件
- Java類的多型機制Java多型
- 父類和子類的建構函式問題函式
- 父類和子類之間的轉換問題
- Python 中的引用和類屬性的理解Python
- 父類和子類物件的獲取值的方式驗證,透過父類屬性的方式獲取不到值,需要使用get方法物件
- 子類重寫父類的方法@Override的快捷鍵IDE
- 子類擁有父類物件所有的屬性和方法,但無法訪問物件
- 子類繼承父類的建構函式(方法)嗎?繼承函式
- 子類繼承父類(父類和子類裡:塊、靜態塊、構造和方法覆寫)之間呼叫順序繼承
- java多型抽象類例項Java多型抽象
- java中的引用物件Java物件
- 內部類,類修飾符,上轉型物件,多型,介面回撥物件多型
- Java中的類與物件詳解Java物件
- 深入理解python中的類和物件Python物件
- Java超類與子類Java
- Java第八課. 物件導向特徵3-多型&抽象類Java物件特徵多型抽象
- 京東獲得jd商品分類API介面(父分類、根分類、子分類)API
- [短文速度-4] new子類是否會例項化父類
- 理解Python中的類物件、例項物件、屬性、方法Python物件