在Java中,向上轉(zhuǎn)型是指將一個(gè)子類(lèi)對(duì)象賦值給一個(gè)父類(lèi)引用變量,向下轉(zhuǎn)型是指將一個(gè)父類(lèi)引用變量強(qiáng)制轉(zhuǎn)換為其子類(lèi)對(duì)象。
向上轉(zhuǎn)型示例:
class Animal {
public void sound() {
System.out.println("Animal makes sound");
}
}
class Dog extends Animal {
public void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog(); // 創(chuàng)建子類(lèi)對(duì)象
Animal animal = dog; // 向上轉(zhuǎn)型,將子類(lèi)對(duì)象賦值給父類(lèi)引用變量
animal.sound(); // 調(diào)用父類(lèi)引用變量的方法會(huì)執(zhí)行子類(lèi)的方法
}
}
輸出結(jié)果為:
Dog barks
向下轉(zhuǎn)型示例:
class Animal {
public void sound() {
System.out.println("Animal makes sound");
}
}
class Dog extends Animal {
public void sound() {
System.out.println("Dog barks");
}
public void fetch() {
System.out.println("Dog fetches");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 創(chuàng)建父類(lèi)引用變量指向子類(lèi)對(duì)象
Dog dog = (Dog) animal; // 向下轉(zhuǎn)型,強(qiáng)制將父類(lèi)引用變量轉(zhuǎn)換為子類(lèi)對(duì)象
dog.fetch(); // 調(diào)用子類(lèi)對(duì)象的方法
}
}
輸出結(jié)果為:
Dog fetches
需要注意的是,向下轉(zhuǎn)型存在風(fēng)險(xiǎn),如果父類(lèi)引用變量指向的實(shí)際對(duì)象不是轉(zhuǎn)型后的類(lèi)型,會(huì)導(dǎo)致運(yùn)行時(shí)異常。因此,在進(jìn)行向下轉(zhuǎn)型時(shí),最好先使用instanceof
運(yùn)算符來(lái)判斷引用變量是否可以轉(zhuǎn)型為目標(biāo)類(lèi)型,以避免運(yùn)行時(shí)異常的發(fā)生。
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.fetch();
} else {
System.out.println("Cannot downcast to Dog");
}