轉型對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 教戰手冊"

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 JoshS 的頭像
    JoshS

    JoshS的部落格

    JoshS 發表在 痞客邦 留言(0) 人氣()