在什么網(wǎng)站可以做外貿(mào)出口勞保鞋sem廣告投放是做什么的
在Java中,類(lèi)型轉(zhuǎn)換主要涉及到兩種類(lèi)型:向上類(lèi)型轉(zhuǎn)換(Upcasting)和向下類(lèi)型轉(zhuǎn)換(Downcasting)。
1. 向上類(lèi)型轉(zhuǎn)換(Upcasting):
向上類(lèi)型轉(zhuǎn)換是將子類(lèi)的對(duì)象轉(zhuǎn)換為父類(lèi)類(lèi)型的對(duì)象。這種轉(zhuǎn)換是自動(dòng)的,也是安全的,因?yàn)樽宇?lèi)對(duì)象包含所有父類(lèi)對(duì)象的信息。所以,在將子類(lèi)對(duì)象賦值給父類(lèi)類(lèi)型的引用時(shí),編譯器會(huì)自動(dòng)完成轉(zhuǎn)換,而不需要程序員進(jìn)行任何特殊的操作。向上轉(zhuǎn)型會(huì)讓子類(lèi)對(duì)象“縮小”,只能調(diào)用父類(lèi)中的方法,對(duì)于子類(lèi)中新增的方法則不可調(diào)用了。
package com.test2;class Animal {void makeSound() {System.out.println("這個(gè)動(dòng)物在發(fā)出聲音。");}
}class Dog extends Animal {void makeSound() {System.out.println("這個(gè)狗在汪汪叫。");}void makeMove() {System.out.println("這個(gè)狗在歡快地奔跑。");}
}public class UpcastingTest {public static void main(String[] args) {Dog myDog = new Dog();myDog.makeSound();myDog.makeMove();Animal myAnimal = myDog; // 向上類(lèi)型轉(zhuǎn)換,安全并自動(dòng)發(fā)生myAnimal.makeSound(); // }
}
在上面代碼這個(gè)例子中,`Dog`是`Animal`的子類(lèi)。當(dāng)我們創(chuàng)建一個(gè)`Dog`對(duì)象并將其賦值給`Animal`類(lèi)型的變量時(shí),就發(fā)生了向上類(lèi)型轉(zhuǎn)換。myAnimal變量是賦值為原myDog對(duì)象變量轉(zhuǎn)換后的值。則myAnimal失去了子類(lèi)Dog中新增的方法makeMove()。
但是子類(lèi)Dog重寫(xiě)了父類(lèi)Animal的MakeSound()方法,Dog類(lèi)實(shí)例對(duì)象myDog轉(zhuǎn)換為Animal類(lèi)對(duì)象賦值給myAnimal對(duì)象是失去了新增方法,但是調(diào)用的makeSound()方法依然是Dog類(lèi)中重新寫(xiě)的方法。如果Dog類(lèi)中沒(méi)有重寫(xiě)makeSound()方法,轉(zhuǎn)化前和轉(zhuǎn)換后,都將是調(diào)用父類(lèi)中的方法。
2. 向下類(lèi)型轉(zhuǎn)換(Downcasting):
在Java中,要成功進(jìn)行向下轉(zhuǎn)型(從父類(lèi)到子類(lèi)),必須滿(mǎn)足以下兩個(gè)條件:
(1)對(duì)象必須是子類(lèi)的實(shí)例:
? ?對(duì)象實(shí)際上必須是你要轉(zhuǎn)型的子類(lèi)的一個(gè)實(shí)例。如果對(duì)象不是子類(lèi)的實(shí)例,那么轉(zhuǎn)型會(huì)失敗,并拋出`ClassCastException`異常。
(2)顯式類(lèi)型轉(zhuǎn)換:
? ?必須使用類(lèi)型轉(zhuǎn)換操作符`(子類(lèi)類(lèi)型)`來(lái)進(jìn)行向下轉(zhuǎn)型。編譯器會(huì)檢查轉(zhuǎn)型的合法性,并且在運(yùn)行時(shí)也會(huì)進(jìn)行類(lèi)型檢查。
下面是一個(gè)成功向下轉(zhuǎn)型的例子:
class Animal {void makeSound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {void bark() {System.out.println("Dog barks");}
}public class Main {public static void main(String[] args) {// 創(chuàng)建一個(gè)Dog對(duì)象Animal animal = new Dog();// 檢查對(duì)象是否實(shí)際是Dog的實(shí)例if (animal instanceof Dog) {// 顯式向下轉(zhuǎn)型為Dog類(lèi)型Dog dog = (Dog) animal;// 現(xiàn)在可以調(diào)用Dog類(lèi)特有的方法dog.bark();} else {// 如果不是Dog的實(shí)例,則不執(zhí)行轉(zhuǎn)型System.out.println("Cannot cast to Dog");}}
}
在這個(gè)例子中,`animal`變量被聲明為`Animal`類(lèi)型,但實(shí)際上它引用了一個(gè)`Dog`對(duì)象。通過(guò)`instanceof`檢查,我們確認(rèn)`animal`實(shí)際上是`Dog`的一個(gè)實(shí)例,然后安全地將其轉(zhuǎn)型為`Dog`類(lèi)型。轉(zhuǎn)型成功后,我們就可以調(diào)用`Dog`類(lèi)中的方法了。
總之,成功向下轉(zhuǎn)型的關(guān)鍵在于確保對(duì)象確實(shí)是你想要轉(zhuǎn)型的子類(lèi)的一個(gè)實(shí)例,并且在轉(zhuǎn)型前使用`instanceof`來(lái)驗(yàn)證這一點(diǎn)。如果不確定對(duì)象是否是特定子類(lèi)的實(shí)例,就應(yīng)該避免進(jìn)行向下轉(zhuǎn)型,以防止運(yùn)行時(shí)錯(cuò)誤。
簡(jiǎn)單理解:
(1)向上轉(zhuǎn)換:子類(lèi)創(chuàng)建的實(shí)例變量賦值給一個(gè)父類(lèi)類(lèi)型的變量,這是合法允許的,但是會(huì)進(jìn)行“向上轉(zhuǎn)換”,父類(lèi)類(lèi)型的變量雖然被賦值了子類(lèi)實(shí)例,但是會(huì)閹割掉子類(lèi)中新增的方法,和父類(lèi)相同的方法依然可以使用,使用的是子類(lèi)中定義的方法。
(2)向下轉(zhuǎn)換:這是不建議的,需要滿(mǎn)足2個(gè)條件才可以,否則發(fā)生會(huì)失敗而發(fā)出異常。兩個(gè)條件是父類(lèi)定義的變量是通過(guò)實(shí)例化子類(lèi)賦值的(只是該變量被聲明成了父類(lèi)的類(lèi)型),經(jīng)過(guò)顯式的類(lèi)型轉(zhuǎn)化后,重新轉(zhuǎn)換為子類(lèi)類(lèi)型的變量,可以使用子類(lèi)中定義的相關(guān)方法。