1.代碼理解
class A
{
}
class B extends A
{
}
class Test
{
public static void main(String[] args)
{
A a1 = new A();
B b1 = new B();
//b1 = a1; //error,子類引用不能直接賦給父類引用
b1 = (B)a1; /*編譯不會(huì)報(bào)錯(cuò),運(yùn)行會(huì)報(bào)錯(cuò),說明語法沒問題
但a引用實(shí)際上還是指向A類對(duì)象,這樣賦值依舊會(huì)出問題*/
}
}
結(jié)果:Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B
class A
{
}
class B extends A
{
}
class Test
{
public static void main(String[] args)
{
A a1 = new A();
B b1 = new B();
a1 = b1; //a1指向B類對(duì)象,或者A a1 = new B()
b1 = (B)a1; //此時(shí)不會(huì)報(bào)錯(cuò),因?yàn)閍1指向的是B類的對(duì)象,(B)不可省略
}
}
2.多態(tài)注意事項(xiàng)總結(jié)
- 子類對(duì)象引用可以直接賦給父類引用,但父類引用不能直接賦給子類引用。
- 通過父類引用只能訪問從父類繼承過來的成員,不能訪問子類獨(dú)有的成員。
- 只有在父類引用本身指向子類對(duì)象時(shí),才可以把父類引用強(qiáng)制轉(zhuǎn)化為子類引用。其他情況下,把父類引用強(qiáng)制轉(zhuǎn)化子類引用,運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。