轉型對Josh來說也是上Java課程時非常頭痛的一則,所以一樣,寫下來增加記憶力
這邊也來稍微介紹一下!!
以 黃彬華老師在 基峯"Scjp教戰手冊"範例題為例
abstract class A{
abstract void a1();
void a2(){};
}
class B extends A{
void a1(){}
void a2(){}
}
class C extends B{
void c1(){}
}
A x = new B(); C y = new C(); A z = new C();
首先 x 為A,被指向B子類別的新實體,這樣是OK的 反之如果是B x = new A() 則是錯誤 一來A為抽象類別不可實體化 二來子類別不可被指向父類別會編譯失敗
而 A x = new B() 這段中的x 內屬性值會來至A內而方法則來自B內(這邊我不會解釋)若方法A內沒有B的方法則x也不會有B的方法,但若A及B內都有相同方法
則x 內容會以指向B的方法為主
而下方有六個選項
1 x.a2(); // 正確被呼叫
2 z.a2(); // 正確呼叫 z 實體為A,所以也會有A內的方法
3 z.c1(); // 錯誤 z 實體為A,但A內並無c1 所以編譯會失敗
4 z.a1(); // 正確呼叫
5 y.c1(); // 正確呼叫
6 x.a1() // 正確呼叫
再一題
Class Alpha{
public void foo(){System.out.print("Afoo ");}
}
public class Beta extends Alpha{
public void foo(){System.out.print("Bfoo ");}
public static void main(String[] args){
Alpha a = new Beta();
Beta b = (Beta)a;
a.foo();
b.foo();
}
}
a 本身是父類別Alpha 去只向 子類別 Beta 這樣OK
b 為Bata 而 a 本身雖為Alpha 但只向內容為Beta 然後再轉型為Beta 這樣也沒問題
所以上面程式是會編譯成功
以上參考 基峯"SCJP6.0 教戰手冊"