通俗理解向上轉(zhuǎn)型:就是子類轉(zhuǎn)型成父類棕洋。
class A
{
}
class B extends A
{
}
A a = new B();
這個(gè)就是向上轉(zhuǎn)型。
向上轉(zhuǎn)化后只能調(diào)用父類的方法头岔,
向下轉(zhuǎn)型
A a = new B();
B a1 = (B) a;
只有經(jīng)歷過(guò)向下轉(zhuǎn)型的對(duì)象才能向上轉(zhuǎn)型
附:
子類轉(zhuǎn)型成父類是向上轉(zhuǎn)型,反過(guò)來(lái)說(shuō)鼠证,父類轉(zhuǎn)型成子類就是向下轉(zhuǎn)型峡竣。
但是,向下轉(zhuǎn)型可能會(huì)帶來(lái)一些問(wèn)題:我們可以說(shuō)麻雀是鳥量九,但不能說(shuō)鳥就是麻雀适掰。來(lái)看下面的例子:
A類:
package a.b;
public class A {
void aMthod() {
System.out.println("A method");
}
}
A的子類B:
package a.b;
public class B extends A {
void bMethod1() {
System.out.println("B method 1");
}
void bMethod2() {
System.out.println("B method 2");
}
}
C類:
package a.b;
public class C {
public static void main(String[] args) {
A a1 = new B(); // 向上轉(zhuǎn)型
a1.aMthod(); // 調(diào)用父類aMthod(),a1遺失B類方法bMethod1()荠列、bMethod2()
B b1 = (B) a1; // 向下轉(zhuǎn)型类浪,編譯無(wú)錯(cuò)誤,運(yùn)行時(shí)無(wú)錯(cuò)誤
b1.aMthod(); // 調(diào)用父類A方法
b1.bMethod1(); // 調(diào)用B類方法
b1.bMethod2(); // 調(diào)用B類方法
A a2 = new A();
B b2 = (B) a2; // 向下轉(zhuǎn)型肌似,編譯無(wú)錯(cuò)誤费就,運(yùn)行時(shí)將出錯(cuò)
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
}
從上面的代碼我們可以得出這樣一個(gè)結(jié)論:向下轉(zhuǎn)型需要使用強(qiáng)制轉(zhuǎn)換。運(yùn)行C程序川队,控制臺(tái)將輸出:
Exception in thread "main" java.lang.ClassCastException: a.b.A cannot be cast to a.b.B at
a.b.C.main(C.java:14)
A method
A method
B method 1
B method 2
其實(shí)黑體部分的向下轉(zhuǎn)型代碼后的注釋已經(jīng)提示你將發(fā)生運(yùn)行時(shí)錯(cuò)誤力细。為什么前一句向下轉(zhuǎn)型代碼可以,而后一句代碼卻出錯(cuò)固额?這是因?yàn)閍1指向一個(gè)子類B的對(duì)象眠蚂,所以子類B的實(shí)例對(duì)象b1當(dāng)然也可以指向a1。而a2是一個(gè)父類對(duì)象斗躏,子類對(duì)象b2不能指向父類對(duì)象a2逝慧。那么如何避免在執(zhí)行向下轉(zhuǎn)型時(shí)發(fā)生運(yùn)行時(shí)ClassCastException異常?使用5.7.7節(jié)學(xué)過(guò)的instanceof就可以了瑟捣。我們修改一下C類的代碼:
A a2 = new A();
if (a2 instanceof B) {
B b2 = (B) a2;
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
這樣處理后馋艺,就不用擔(dān)心類型轉(zhuǎn)換時(shí)發(fā)生ClassCastException異常了
From 20180110 廣州