Java对象类型转换
將一個(gè)類型強(qiáng)制轉(zhuǎn)換成另一個(gè)類型的過程被稱為類型轉(zhuǎn)換。本節(jié)所說的對(duì)象類型轉(zhuǎn)換,是指存在繼承關(guān)系的對(duì)象,不是任意類型的對(duì)象。當(dāng)對(duì)不存在繼承關(guān)系的對(duì)象進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí),會(huì)拋出 Java 強(qiáng)制類型轉(zhuǎn)換(java.lang.ClassCastException)異常。
Java 語言允許某個(gè)類型的引用變量引用子類的實(shí)例,而且可以對(duì)這個(gè)引用變量進(jìn)行類型轉(zhuǎn)換。
Java 中引用類型之間的類型轉(zhuǎn)換(前提是兩個(gè)類是父子關(guān)系)主要有兩種,分別是向上轉(zhuǎn)型(upcasting)和向下轉(zhuǎn)型(downcasting)。
1 . 向上轉(zhuǎn)型
父類引用指向子類對(duì)象為向上轉(zhuǎn)型,語法格式如下:
其中,fatherClass 是父類名稱或接口名稱,obj 是創(chuàng)建的對(duì)象,sonClass 是子類名稱。
向上轉(zhuǎn)型就是把子類對(duì)象直接賦給父類引用,不用強(qiáng)制轉(zhuǎn)換。使用向上轉(zhuǎn)型可以調(diào)用父類類型中的所有成員,不能調(diào)用子類類型中特有成員,最終運(yùn)行效果看子類的具體實(shí)現(xiàn)。
2 . 向下轉(zhuǎn)型
與向上轉(zhuǎn)型相反,子類對(duì)象指向父類引用為向下轉(zhuǎn)型,語法格式如下:
其中,fatherClass 是父類名稱,obj 是創(chuàng)建的對(duì)象,sonClass 是子類名稱。
向下轉(zhuǎn)型可以調(diào)用子類類型中所有的成員,不過需要注意的是如果父類引用對(duì)象指向的是子類對(duì)象,那么在向下轉(zhuǎn)型的過程中是安全的,也就是編譯是不會(huì)出錯(cuò)誤。但是如果父類引用對(duì)象是父類本身,那么在向下轉(zhuǎn)型的過程中是不安全的,編譯不會(huì)出錯(cuò),但是運(yùn)行時(shí)會(huì)出現(xiàn)我們開始提到的 Java 強(qiáng)制類型轉(zhuǎn)換異常,一般使用 instanceof 運(yùn)算符來避免出此類錯(cuò)誤。
例如,Animal 類表示動(dòng)物類,該類對(duì)應(yīng)的子類有 Dog 類,使用對(duì)象類型表示如下:
Animal animal = new Dog(); // 向上轉(zhuǎn)型,把Dog類型轉(zhuǎn)換為Animal類型Dog dog = (Dog) animal; // 向下轉(zhuǎn)型,把Animal類型轉(zhuǎn)換為Dog類型示例對(duì)象類型的轉(zhuǎn)換。例如,父類 Animal 和子類 Cat 中都定義了實(shí)例變量 name、靜態(tài)變量 staticName、實(shí)例方法 eat() 和靜態(tài)方法 staticEat()。此外,子類 Cat 中還定義了實(shí)例變量 str 和實(shí)例方法 eatMethod()。
父類 Animal 的代碼如下:
public class Animal {public String name = "Animal:動(dòng)物";public static String staticName = "Animal:可愛的動(dòng)物";public void eat() {System.out.println("Animal:吃飯");}public static void staticEat() {System.out.println("Animal:動(dòng)物在吃飯");} }子類 Cat 的代碼如下:
public class Cat extends Animal {public String name = "Cat:貓";public String str = "Cat:可愛的小貓";public static String staticName = "Dog:我是喵星人";public void eat() {System.out.println("Cat:吃飯");}public static void staticEat() {System.out.println("Cat:貓?jiān)诔燥?#34;);}public void eatMethod() {System.out.println("Cat:貓喜歡吃魚");}public static void main(String[] args) {Animal animal = new Cat();Cat cat = (Cat) animal; // 向下轉(zhuǎn)型System.out.println(animal.name); // 輸出Animal類的name變量System.out.println(animal.staticName); // 輸出Animal類的staticName變量animal.eat(); // 輸出Cat類的eat()方法animal.staticEat(); // 輸出Animal類的staticEat()方法System.out.println(cat.str); // 調(diào)用Cat類的str變量cat.eatMethod(); // 調(diào)用Cat類的eatMethod()方法} }通過引用類型變量來訪問所引用對(duì)象的屬性和方法時(shí),Java 虛擬機(jī)將采用以下綁定規(guī)則:
實(shí)例方法與引用變量實(shí)際引用的對(duì)象的方法進(jìn)行綁定,這種綁定屬于動(dòng)態(tài)綁定,因?yàn)槭窃谶\(yùn)行時(shí)由 Java 虛擬機(jī)動(dòng)態(tài)決定的。例如,animal.eat() 是將 eat() 方法與 Cat 類綁定。靜態(tài)方法與引用變量所聲明的類型的方法綁定,這種綁定屬于靜態(tài)綁定,因?yàn)槭窃诰幾g階段已經(jīng)做了綁定。例如,animal.staticEat() 是將 staticEat() 方法與 Animal 類進(jìn)行綁定。成員變量(包括靜態(tài)變量和實(shí)例變量)與引用變量所聲明的類型的成員變量綁定,這種綁定屬于靜態(tài)綁定,因?yàn)樵诰幾g階段已經(jīng)做了綁定。例如,animal.name 和 animal.staticName 都是與 Animal 類進(jìn)行綁定。對(duì)于 Cat 類,運(yùn)行時(shí)將會(huì)輸出如下結(jié)果:
Animal:動(dòng)物 Animal:可愛的動(dòng)物 Cat:吃飯 Animal:動(dòng)物在吃飯 Cat:可愛的小貓 Cat:貓喜歡吃魚強(qiáng)制對(duì)象類型轉(zhuǎn)換
Java 編譯器允許在具有直接或間接繼承關(guān)系的類之間進(jìn)行類型轉(zhuǎn)換。對(duì)于向下轉(zhuǎn)型,必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換;對(duì)于向上轉(zhuǎn)型,不必使用強(qiáng)制類型轉(zhuǎn)換。
例如,對(duì)于一個(gè)引用類型的變量,Java 編譯器按照它聲明的類型來處理。如果使用 animal 調(diào)用 str 和 eatMethod() 方法將會(huì)出錯(cuò),如下:
animal.str = ""; // 編譯出錯(cuò),提示Animal類中沒有str屬性animal.eatMethod(); // 編譯出錯(cuò),提示Animal類中沒有eatMethod()方法如果要訪問 Cat 類的成員,必須通過強(qiáng)制類型轉(zhuǎn)換,如下:
((Cat)animal).str = ""; // 編譯成功((Cat)animal).eatMethod(); // 編譯成功把 Animal 對(duì)象類型強(qiáng)制轉(zhuǎn)換為 Cat 對(duì)象類型,這時(shí)上面兩句編譯成功。對(duì)于如下語句,由于使用了強(qiáng)制類型轉(zhuǎn)換,所以也會(huì)編譯成功,例如:
Cat cat = (Cat)animal; // 編譯成功,將Animal對(duì)象類型強(qiáng)制轉(zhuǎn)換為Cat對(duì)象類型類型強(qiáng)制轉(zhuǎn)換時(shí)想運(yùn)行成功就必須保證父類引用指向的對(duì)象一定是該子類對(duì)象,最好使用 instanceof 運(yùn)算符判斷后,再強(qiáng)轉(zhuǎn),例如:
Animal animal = new Cat(); if (animal instanceof Cat) {Cat cat = (Cat) animal; // 向下轉(zhuǎn)型... }子類的對(duì)象可以轉(zhuǎn)換成父類類型,而父類的對(duì)象實(shí)際上無法轉(zhuǎn)換為子類類型。因?yàn)橥ㄋ椎刂v,父類擁有的成員子類肯定也有,而子類擁有的成員,父類不一定有。因此,對(duì)于向上轉(zhuǎn)型,不必使用強(qiáng)制類型轉(zhuǎn)換。例如:
Cat cat = new Cat(); Animal animal = cat; // 向上轉(zhuǎn)型,不必使用強(qiáng)制類型轉(zhuǎn)換如果兩種類型之間沒有繼承關(guān)系,那么將不允許進(jìn)行類型轉(zhuǎn)換。例如:
Dog dog = new Dog();Cat cat = (Cat)dog; // 編譯出錯(cuò),不允許把Dog對(duì)象類型轉(zhuǎn)換為Cat對(duì)象類型總結(jié)
以上是生活随笔為你收集整理的Java对象类型转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse编辑器字体大小的设置
- 下一篇: C语言选择结构和循环结构的汇总