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類對象沾谓,這樣賦值依舊會(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類對象,或者A a1 = new B()
b1 = (B)a1; //此時(shí)不會(huì)報(bào)錯(cuò)超营,因?yàn)閍1指向的是B類的對象,(B)不可省略
}
}
2.多態(tài)注意事項(xiàng)總結(jié)
- 子類對象引用可以直接賦給父類引用脑融,但父類引用不能直接賦給子類引用疮装。
- 通過父類引用只能訪問從父類繼承過來的成員,不能訪問子類獨(dú)有的成員粘都。
- 只有在父類引用本身指向子類對象時(shí)廓推,才可以把父類引用強(qiáng)制轉(zhuǎn)化為子類引用。其他情況下翩隧,把父類引用強(qiáng)制轉(zhuǎn)化子類引用樊展,運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。