110 一般警察特考三等 警察資訊管理人員 物件導向程式設計 考古題詳解
第 一 題15 分
請寫出執行下列 Java 程式碼的輸出結果。
(一) public class Testa { public static void main(String[] args) { int[] a = {1, 2, 3, 4}; swap(a); System.out.println("a[0] = " + a[0]); }
public static void swap(int[] data) {
int temp = data[0];
data[0] = data[data.length - 1];
data[data.length - 1] = temp;
}
}
(二) public class Testb { public static void main(String[] args) { T t = new T(); swap(t); System.out.println("e1 = " + t.e1 + ", e2 = " + t.e2); }
public static void swap(T t) {
int temp = t.e1;
t.e1 = t.e2;
t.e2 = temp;
}
}
class T { int e1 = 1; int e2 = 2; }
(三) public class Testb { public static void main(String[] args) { T t = new T(); swap(t.e1, t.e2); System.out.println("e1 = " + t.e1 + ", e2 = " + t.e2); }
public static void swap(int e1, int e2) {
int temp = e1;
e1 = e2;
e2 = temp;
}
}
class T { int e1 = 1; int e2 = 2; }
登入後即可作答並保存紀錄。
核心觀念
本題考 Java 傳遞參數的方式,以及基本型別與參考型別在方法呼叫時的差異。
Java 一律採用傳值呼叫(pass by value):呼叫方法時,方法取得的是引數值的副本。
- 若引數是基本型別,例如
int,複製的是整數值;方法內改動參數,不會改到呼叫端的變數。 - 若引數是陣列或物件,複製的是參考值;呼叫端與方法中的參數會參考同一個陣列或物件。因此,方法透過參考修改其元素或欄位,呼叫端可觀察到修改結果。
解題方法
(一)傳入陣列,交換首尾元素
a 初始內容為 {1, 2, 3, 4}。呼叫 swap(a) 時,方法取得陣列參考值的副本,但該參考仍指向同一個陣列。
方法內:
temp先保存data[0],即1。data[0] = data[data.length - 1],將最後一個元素4放到第一格。data[data.length - 1] = temp,將原第一個元素1放到最後一格。
陣列變成 {4, 2, 3, 1},因此輸出:
a[0] = 4
(二)傳入物件,交換物件欄位
第 二 題30 分
請設計程式,定義一個名為 Flower 的類別(class),該類別中每個物件有三個 private 實例變數(instance variables),分別代表花的名稱(name)、花瓣個數(petal)和價格(price),其資料型態應分別為 String、int 和 float。
您的類別應包含相關資料宣告、建構函式(constructor),以及存取三個資料的 getter 和 setter 方法(methods)。
登入後即可作答並保存紀錄。
核心觀念
本題考查類別的基本設計:以 class 定義類別,將物件的狀態(資料)設為 private,再透過 public 的建構函式、getter 與 setter 方法建立及存取資料。
三個實例變數的名稱與型態分別為:
- 花名:
String name - 花瓣數:
int petal - 價格:
float price
解題方法
先依題意宣告三個 private 實例變數;再撰寫建構函式,以參數設定物件建立時的初始資料;最後為每個變數各提供一個 getter 與 setter。Java 的建構函式名稱須與類別名稱相同,且沒有回傳型態。
第 三 題15 分
Java 程式執行期間的錯誤會以例外(Exception)的形式被丟出。如果例外不作處理,程式便會終止執行。
請列舉出任意三種執行期間例外(RuntimeException)的子類別(subclass)名稱,並說明其發生原因。(15 分)
請說明在例外處理中使用 finally 子句(clause)的主要目的。(5 分)
登入後即可作答並保存紀錄。
核心觀念
Java 的例外類別主要分為受檢例外(checked exception)與非受檢例外(unchecked exception)。RuntimeException 及其子類別屬於非受檢例外,通常代表程式執行時發生的邏輯或資料使用錯誤;編譯器不要求程式必須以 catch 捕捉,或在方法宣告中以 throws 列出。
本題要掌握兩件事:能辨認常見的 RuntimeException 子類別及其發生原因,以及了解 finally 子句的用途。
解題方法
題目要求「任意三種」,因此可從常見的執行時錯誤中列舉三例,並將每一種例外與其觸發條件配對說明。答題時應寫出完整類別名稱,並說明錯誤發生的情境,而不只列出名稱。
finally 的重點則是:不論 try 區塊是否發生例外,以及例外是否被捕捉,通常都會執行 finally 區塊,常用於釋放資源或執行必要的收尾工作。
RuntimeException 子類別與發生原因
以下列出三種常見類別:
-
NullPointerException(空指標例外) 程式透過值為null的參考存取物件欄位、呼叫物件方法,或進行其他需要實際物件的操作時發生。例如:對尚未指向物件的參考呼叫方法。 -
ArrayIndexOutOfBoundsException(陣列索引超出範圍例外) 存取陣列時,使用小於 或大於等於陣列長度的索引值。例如,長度為 的陣列,其有效索引範圍是 到 。
第 四 題10 分
請分別說明 this 及 super 兩個關鍵字(keyword)的使用情境。
登入後即可作答並保存紀錄。
核心觀念
本題考查物件導向程式設計中,this 與 super 的用途。兩者都與物件的成員存取有關,但指涉對象不同:
this指向目前正在執行方法的物件,可用來存取該物件的欄位、方法或建構子。super用於存取目前類別的父類別中被繼承的欄位、方法或建構子。
以下以 Java 說明。
解題方法
判斷兩個關鍵字時,先看要存取的是「目前物件」還是「父類別所繼承的成員」:
- 要指明目前物件的成員,使用
this。 - 要呼叫父類別的建構子,或明確呼叫父類別被覆寫的方法,使用
super。 - 若子類別與父類別有同名成員,
this指向子類別目前物件的成員;super則可明確存取父類別版本。
例如:
class Parent {
int value = 10;
void show {
System.out.println("Parent");
}
}
class Child extends Parent {
int value = 20;
void show {
System.out.println(this.value); // 20:Child 的 value
System.out.println(super.value); // 10:Parent 的 value
super.show; // 呼叫 Parent 的 show
}
}
在建構子中,this(...) 可呼叫同一類別的另一個建構子;super(...) 可呼叫父類別的建構子。兩者若出現在建構子中,都必須是第一個敘述,且不能同時作為同一建構子的第一個呼叫。
class Child extends Parent {
Child {
super; // 呼叫父類別建構子
}
}
第 五 題25 分
請設計程式從檔案(data.txt)讀入整數資料。若其中有資料重複出現,僅保留首次出現者,去除第二次以及後續之重複資料。最後,按原順序將資料輸出至檔案 unique.txt。
範例一:
檔案 data.txt 內容:3 4 5 7 9 5 4 19 4
檔案 unique.txt 內容:3 4 5 7 9 19
範例二:
檔案 data.txt 內容:128 5 7 23 4
檔案 unique.txt 內容:128 5 7 23 4
登入後即可作答並保存紀錄。
核心觀念
本題考查 Java 檔案讀寫與集合的使用。以 Scanner 依序讀取 data.txt 中的整數,再用 HashSet<Integer> 記錄已出現的數字。Set.add 在數字首次加入時回傳 true,遇到重複數字時回傳 false,因此可判斷是否應輸出。
HashSet 不保證元素順序,但本題只用它判斷重複;資料一讀入就依原順序輸出,所以結果仍保留首次出現的順序。
解題方法
逐一讀取輸入整數,並呼叫 seen.add(number):
- 回傳
true:首次出現,輸出至unique.txt。 - 回傳
false:曾經出現過,不輸出。
使用 first 旗標在數字之間輸出空格,避免檔案開頭或結尾多出空格。以下程式假設 data.txt 中的整數以空白或換行分隔,並與程式放在同一目錄。