1. 程式人生 > 其它 >java 多型

java 多型

技術標籤:java語法

1.概述

1.多型概述

所謂多型就是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。因為在程式執行時才確定具體的類,這樣,不用修改源程式程式碼,就可以讓引用變數繫結到各種不同的類實現上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式程式碼就可以改變程式執行時所繫結的具體程式碼,讓程式可以選擇多個執行狀態,這就是多型性。

2.多型現實意義理解:

  • 現實事物經常會體現出多種形態,如學生,學生是人的一種,則一個具體的同學張三既是學生也是人,即出現兩種形態。
  • Java作為面向物件的語言,同樣可以描述一個事物的多種形態。如Student類繼承了Person類,一個Student的物件便既是Student,又是Person。

3.多型的定義與使用格式

定義格式:父類型別 變數名=new 子類型別();

2.多型中成員的特點

1.多型成員變數:編譯執行看左邊

   Fu f=new Zi();
   System.out.println(f.num);//f是Fu中的值,只能取到父中的值

2.多型成員方法:編譯看左邊,執行看右邊

   Fu f1=new Zi();
   System.out.println(f1.show());//f1的門面型別是Fu,但實際型別是Zi,所以呼叫的是重寫後的方法。

3.多型的轉型

多型的轉型分為向上轉型和向下轉型兩種:

  • 向上轉型:多型本身就是向上轉型過的過程
		 使用格式:父類型別 變數名=new 子類型別();
         適用場景:當不需要面對子類型別時,通過提高擴充套件性,或者使用父類的功能就能完成相應的操作。
  • 向下轉型:一個已經向上轉型的子類物件可以使用強制型別轉換的格式,將父類引用型別轉為子類引用各型別
 		 使用格式:子類型別 變數名=(子類型別) 父類型別的變數;
         適用場景:當要使用子類特有功能時。

5.多型的情況下,子父類存在同名的成員變數或成員方法優先呼叫問題

1.多型的情況下,子父類存在同名的成員變數時,預設訪問的是父類的成員變數資料.

2.多型的情況下,子父類存在同名的非靜態函式的時候,預設是呼叫子類的成員函式.
3.多型的情況下,子父類存在同名的靜態函式時,預設是呼叫父類的成員函式.

原因:
java多型的實現,首先說成員變數,因為在java中,一個物件例項是儲存在堆中的,而這個物件包含的內容有物件頭,物件體以及對其位元組,首先物件頭存放的是物件執行時的資料,像是hashcode,鎖標識,型別指標,那麼物件體中存放的是物件的成員變數,成員變數包括從父類繼承過的成員變數和本類的成員變數,那麼如果父類和子類有重名的變數,那麼這個時候就要看物件的靜態型別是什麼了,靜態型別就是宣告型別,如果宣告型別是父類那麼就直接選取父類的成員變數,如果宣告型別是自己的類那麼就選取本身類的成員變數,所以選取同名的成員變數的時候是根據靜態型別來的。下面再看下成員方法的選取,方法其實是在方法區存放著一張虛表,虛表中存放著是方法的實際入口地址,在實際物件呼叫的時候虛表會做動態的改變,如果一個方法在子類中被重寫了,而這時靜態型別又是父類,那麼就把虛表中被重寫方法的實際入口地址,替換成被重寫的方法的入口地址,所以在呼叫的時候是訪問不到被重寫的舊方法的。而靜態方法直接就不能被重寫,更別說呼叫被重寫之後的方法,而且靜態方法是屬於類的,所以在呼叫的時候,直接呼叫的是本類的方法,與執行時物件是沒關係的。