Java 第9天面向對象(中)對象類型轉換:向上轉型和向下轉型

寫在前言 : 學習資源B站是最好的也是很全面。
1 、現在出去面試,面試官老是會問你一句話Java 怎麼樣?
不管是大數據崗位還是數據庫都會問一句。 回來痛下決心,決定探索下這門語言的精髓,大數據很多框架也都是Java 寫的,的確懂一門語言,比較穩妥。路也寬敞!!!不然就和喫飯沒筷子,那麼尷尬。把每天學習到的 Java知識分享到這裏會。直到能自己寫個複雜一點Dome得出來。
2、爲了監督自己探索這門語言的動力與決心。特此這段話放到前面!!!
3、挑戰下自己 到底是笨 還是學不會,還是不想學。 好運

1、概述:

將一個類型強制轉換成另一個類型的過程被稱爲類型轉換。本節所說的對象類型轉換,是指存在繼承關係的對象,不是任意類型的對象。當對不存在繼承關係的對象進行強制類型轉換時,會拋出 Java 強制類型轉換(java.lang.ClassCastException)異常。

2、

Java 語言允許某個類型的引用變量引用子類的實例,而且可以對這個引用變量進行類型轉換。Java 中引用類型之間的類型轉換(前提是兩個類是父子關係)主要有兩種,分別是向上轉型(upcasting)和向下轉型(downcasting)。

1)向上轉型
父類引用指向子類對象爲向上轉型,語法格式如下:
fatherClass obj = new sonClass();

其中,fatherClass 是父類名稱或接口名稱,obj 是創建的對象,sonClass 是子類名稱。
向上轉型就是把子類對象直接賦給父類引用,不用強制轉換。使用向上轉型可以調用父類類型中的所有成員,不能調用子類類型中特有成員,最終運行效果看子類的具體實現。

2)向下轉型
與向上轉型相反,子類對象指向父類引用爲向下轉型,語法格式如下:
sonClass obj = (sonClass) fatherClass;
其中,fatherClass 是父類名稱,obj 是創建的對象,sonClass 是子類名稱。

向下轉型可以調用子類類型中所有的成員,不過需要注意的是如果父類引用對象指向的是子類對象,那麼在向下轉型的過程中是安全的,也就是編譯是不會出錯誤。但是如果父類引用對象是父類本身,那麼在向下轉型的過程中是不安全的,編譯不會出錯,但是運行時會出現我們開始提到的 Java 強制類型轉換異常,一般使用 instanceof 運算符來避免出此類錯誤。
Dog dog = (Dog) animal; // 向下轉型,把Animal類型轉換爲Dog類型

3、栗子:

在這裏插入圖片描述
在這裏插入圖片描述註解:
通過引用類型變量來訪問所引用對象的屬性和方法時,Java 虛擬機將採用以下綁定規則:
實例方法與引用變量實際引用的對象的方法進行綁定,這種綁定屬於動態綁定,因爲是在運行時由 Java 虛擬機動態決定的。例如,animal.eat() 是將 eat() 方法與 Cat 類綁定。
靜態方法與引用變量所聲明的類型的方法綁定,這種綁定屬於靜態綁定,因爲是在編譯階段已經做了綁定。例如,animal.staticEat() 是將 staticEat() 方法與 Animal 類進行綁定。
成員變量(包括靜態變量和實例變量)與引用變量所聲明的類型的成員變量綁定,這種綁定屬於靜態綁定,因爲在編譯階段已經做了綁定。例如,animal.name 和 animal.staticName 都是與 Animal 類進行綁定。
在這裏插入圖片描述

強制對象類型轉換

Java 編譯器允許在具有直接或間接繼承關係的類之間進行類型轉換。對於向下轉型,必須進行強制類型轉換;對於向上轉型,不必使用強制類型轉換。

如果要訪問 Cat 類的成員,必須通過強制類型轉換,如下:
((Cat)animal).str = “”; // 編譯成功
((Cat)animal).eatMethod(); // 編譯成功

子類的對象可以轉換成父類類型,而父類的對象實際上無法轉換爲子類類型。因爲通俗地講,父類擁有的成員子類肯定也有,而子類擁有的成員,父類不一定有。因此,對於向上轉型,不必使用強制類型轉換。例如:

Cat cat = new Cat();
Animal animal = cat; // 向上轉型,不必使用強制類型轉換

4、instanceof 關鍵字的使用

  • A :判斷對象a 是否是類A的實例。如果是返回true,如果不是返回false。
  • 使用場景:爲了避免在向下轉型時出現類異常,我們在向下轉型之前,先進行instanceof 的判斷,一旦返回true,就進行向下轉型,返回false 不進行向下轉型。

【轉載註明出處,還望尊重原創 】

 

【作者水平有限,如有錯誤歡迎指正 .】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章