基于java的繼承躺涝,向上或者向下轉(zhuǎn)型是一種常見的情景逊笆,在thinking in java對這一情況進(jìn)行了詳細(xì)說明谋减,見以下例子:
class Useful {
public void f() {}
public void g() {}
}
class MoreUseful extends Useful {
public void f() {}
public void g() {}
public void u() {}
public void v() {}
public void w() {}
}
public class RTTI {
public static void main(String[] args) {
Useful[] x = {
new Useful(),
new MoreUseful()
};
x[0].f();
x[1].g();
// Compile time: method not found in Useful:
//! x[1].u();
((MoreUseful)x[1]).u(); // Downcast/RTTI
((MoreUseful)x[0]).u(); // Exception thrown
}
}
在以上例子內(nèi)艇肴,x[0],x[1]在對象實(shí)例化時(shí)激蹲,均向上轉(zhuǎn)型棉磨,但是其子類是不一樣的。因此在進(jìn)行向下轉(zhuǎn)型時(shí)学辱,調(diào)用原本不存在的方法乘瓤,則會報(bào)錯(cuò),見下面第二行代碼:
((MoreUseful)x[1]).u(); // Downcast/RTTI ((MoreUseful)x[0]).u(); // Exception thrown
這個(gè)涉及到Run-Time Type Information(RTTI)概念策泣。由于java在編譯時(shí)很難確切知道一個(gè)類的實(shí)際類型衙傀,那么在代碼運(yùn)行期間,則會進(jìn)行類型檢查萨咕,若類型相符則正常運(yùn)行统抬,類型異常則拋出ClassCastException.
如果想知道一個(gè)類是否可以進(jìn)行向下轉(zhuǎn)型,可以使用instanceof方法進(jìn)行判斷危队,
return (x[1] instanceof Useful) ? 1 : 0;
結(jié)果返回1.
看了上面的例子聪建,就可以大概了解轉(zhuǎn)型這個(gè)概念。實(shí)際上茫陆,轉(zhuǎn)型在日常開發(fā)中使用的很多金麸,比如以下代碼:
List<String> stringList = new ArrayList<>();
其實(shí)這也是轉(zhuǎn)型。由ArrayList向上轉(zhuǎn)型為List盅弛,只不過平時(shí)寫的太6了钱骂,沒感覺到而已叔锐。