阿摩線上測驗 登入

申論題資訊

試卷:104年 - 104年高等三級暨普通考普通_資訊處理#28869
科目:程式設計
年份:104年
排序:0

申論題內容

六、就物件導向程式而言,現有如下的繼承關係的類別。(15 分)
class GrandFather
{ String name = "GrandFather";
String getName() { return name; }
String whereIam() { return "class GrandFather"; }
} // End of GrandFather class
class Father extends GrandFather
{ String getName() { return name; }
String whereIam() { return "class Father"; }
} // End of Father class
class Son extends Father
{ String name = "Son";
String getName() { return name; }
String whereIam() { return "class Son"; }
} // End of Son class
class Daughter extends Father
{ String getName() { return name; }
String whereIam() { return "class Daughter"; }
} // End of Daughter class
於其他類別方法中使用如下的 statement:
Father f1 = new GrandFather();
Father f2 = new Son();
Father f3 = new Daughter();
System.out.println(f2.getName());
System.out.println(f3.getName());
System.out.println(f2.whereIam());
System.out.println(f3.whereIam());
請問編譯執行後,會顯示什麼結果?如為語法有誤或執行時期發生中斷,請說明原
因,並將該 statement 予以忽視,然後說明可以正確執行 statement 所產生的結果。

詳解 (共 2 筆)

詳解 提供者:moerstw
Son GrandFather class Son class Daughter 不會有錯。
詳解 提供者:hchungw
有幾點需要注意和更正:
繼承與多態性: 在物件導向程式設計中,子類別的物件可以被視為是父類別的一種形式。這就是多態性的概念。但是,父類別的物件不能被直接賦值給子類別的引用而不進行類型轉換,這會導致編譯錯誤。因此,Father f1 = new GrandFather(); 這行程式碼是不合法的,因為 GrandFather 不能被直接賦值給 Father 類型的引用。
方法覆蓋(Overriding)和變數遮蔽(Shadowing): 在這個例子中,getName() 方法在 GrandFather, Father, Son, 和 Daughter 類別中被覆蓋。另一方面,name 變數在 Son 類別中被重新宣告,這將遮蔽(或稱為隱藏)其它類別中的 name 變數。
忽略語法錯誤的情況下,根據給定的程式碼,以下是執行結果的分析:
Father f2 = new Son(); 這行確定了 f2 是 Son 的一個實例,因此 f2.getName() 將返回 Son 類別中 name 變數的值,也就是 "Son"。
Father f3 = new Daughter(); 這行確定了 f3 是 Daughter 的一個實例,但因為 Daughter 並未重新宣告 name 變數,它將從 GrandFather 繼承 name 變數的值 "GrandFather"。
對於 f2.whereIam() 和 f3.whereIam() 的呼叫,由於 whereIam() 方法在所有類別中都被覆蓋,它們將分別返回 "class Son" 和 "class Daughter"。
所以,忽略不合法的 Father f1 = new GrandFather(); 語句,執行結果將會是:
kotlin
Copy code
Son
GrandFather
class Son
class Daughter
這展示了 Java 中多態性、方法覆蓋和變數遮蔽的特性。