普考申論題
112年
[資訊處理] 程式設計概要
第 一 題
📖 題組:
四、請依據以下Java程式碼回答下列問題: 01 import java.util.Scanner; 02 public class MyJavaCode { 03 public static void main(String[] args) { 04 Scanner in = new Scanner(System.in); 05 int a = in.nextInt(); 06 Animal dog = new Dog(); 07 dog.run(a); 08 dog.run(); 09 } 10 } 11 12 class Dog extends Animal { 13 public void run(int units){ 14 System.out.println("Dog's running speed is " + units); 15 } 16 public void run(){ 17 System.out.println("Dog's default running speed is 20"); 18 } 19 }
四、請依據以下Java程式碼回答下列問題: 01 import java.util.Scanner; 02 public class MyJavaCode { 03 public static void main(String[] args) { 04 Scanner in = new Scanner(System.in); 05 int a = in.nextInt(); 06 Animal dog = new Dog(); 07 dog.run(a); 08 dog.run(); 09 } 10 } 11 12 class Dog extends Animal { 13 public void run(int units){ 14 System.out.println("Dog's running speed is " + units); 15 } 16 public void run(){ 17 System.out.println("Dog's default running speed is 20"); 18 } 19 }
📝 此題為申論題,共 3 小題
小題 (一)
請說明Java中class、abstract class與interface之間的主要差異?(10分)
思路引導 VIP
比較物件導向程式設計的三個基礎結構。可從以下面向切入:1. 實體化(是否能用new建立物件)。2. 方法實作(是否允許有實作區塊,包含Java 8的default方法)。3. 繼承關係(單一繼承 extends vs 多重實作 implements)。4. 屬性變數(成員變數的限制,如interface只能是 public static final)。
小題 (二)
請說明上述程式碼那幾行會產生編譯錯誤,以及錯誤的原因。(5分)
思路引導 VIP
審視程式碼,發現程式中直接使用了 Animal 這個名稱(第6行宣告變數型別,第12行作為父類別),但整段程式碼中完全沒有定義 class Animal 或 interface Animal。這會觸發「找不到符號 (Cannot find symbol)」的編譯錯誤。此外,因為變數 dog 型態為 Animal,若假設有空的 Animal 存在,第7, 8行呼叫 run() 時也會因 Animal 無此方法而報錯(多型呼叫限制)。
小題 (三)
不改變原1-19行程式碼順序的條件下,請修正問題(二)之編譯問題,使之可以正常執行。修正不包含左右大括號「{}」,新增或修改之指令行數不可以超過3行。(10分)
思路引導 VIP
問題的根源在於「依賴了不存在的 Animal 類別」。因為題目限制只能修改不超過3行,要在3行內把 Animal 類別無中生有並補齊兩個 run 方法有難度且易犯錯。最乾淨俐落的解法是「拔除依賴」。把第6行宣告型別改回 Dog,把第12行的 extends Animal 刪除,這樣修改剛好2行,且完全消除了所有編譯錯誤。