109 一般警察特考三等 警察資訊管理人員 物件導向程式設計 考古題詳解
第 一 題25 分
請說明物件導向語言中 Private、Public、Protected 如何運用?並說明類型(class)和物件(object)在執行時記憶體配置上的主要差異。
登入後即可作答並保存紀錄。
核心觀念
本題考查物件導向程式設計的存取控制,以及類別與物件的差異。存取修飾詞限制程式碼存取類別成員的範圍;類別則描述物件的共同結構與行為,物件是類別在執行時建立的實例。
解題方法
先比較三種存取修飾詞允許哪些程式碼存取成員,再從「定義」與「實例」區分類別和物件的執行期記憶體配置。
Private、Public、Protected 的運用
- Private(私有):成員只能由該類別內部存取。適合隱藏資料或實作細節,避免外部程式直接修改物件狀態;外部可透過類別提供的公開方法操作資料。
- Public(公開):成員可由外部程式碼透過物件存取,是類別對外提供的介面,例如公開方法或屬性。
- Protected(受保護):成員可由該類別及其子類別存取,適合提供給繼承類別使用,同時不讓一般外部程式碼直接存取。
以常見的類別存取規則概括:
| 存取修飾詞 | 類別內部 | 子類別 | 一般外部程式碼 |
|---|---|---|---|
| Private | 可 | 不可直接存取 | 不可 |
| Protected | 可 | 可 | 不可 |
| Public | 可 | 可 | 可 |
不同程式語言對 protected 的細節規則可能略有差異;作答時應依題目指定的語言判斷。本題未指定語言,以上採一般物件導向語言的基本規則說明。
第 二 題25 分
請說明物件導向語言中超載(overloading)和覆寫(overriding)之前提(使用情境)和功能。
登入後即可作答並保存紀錄。
核心觀念
本題考查物件導向程式設計中兩種常見的多載入/多型機制:
- 超載(overloading):同一個類別中,方法名稱相同,但參數列不同,例如參數數量、型別或排列順序不同。呼叫時依傳入引數選擇相符的方法,通常屬於編譯時期的靜態繫結。
- 覆寫(overriding):子類別重新定義從父類別繼承而來的方法,方法名稱與參數列相同,並符合該語言對回傳型別及存取權限等規則。呼叫時依執行期間物件的實際型別決定執行哪個版本,形成執行時期的動態繫結。
兩者都能讓相同的方法名稱對應不同實作,但前提與用途不同:超載是以不同參數提供多種呼叫方式;覆寫則是讓子類別依自身需求改變繼承的方法行為。
解題方法
作答時可從「方法是否屬於繼承關係」及「差異是參數還是實作」切入:
- 看類別關係:若是在同一類別中以不同參數列定義同名方法,屬於超載;若是子類別重新定義父類別的方法,屬於覆寫。
- 看方法簽章:超載必須有可區別的參數列;覆寫則須符合父類別方法的簽章與語言規定。
- 看呼叫時機:超載通常依編譯時可知的引數型別與參數列決定;覆寫則透過動態繫結,依執行時物件的實際型別決定執行版本。
- 說明功能:超載提升介面使用的便利性;覆寫支援繼承下的行為客製化與多型。
例如:
class Printer {
void print(String text) { }
void print(int number) { } // 超載:參數型別不同
}
class Animal {
void speak { }
}
class Dog extends Animal {
@Override
void speak { } // 覆寫:重新定義繼承的方法
}
Printer 的兩個 print 方法以不同參數處理不同資料;Dog 的 speak 則以子類別自己的方式實作父類別定義的行為。
第 三 題25 分
若有大量資料要處理,想利用多執行緒加速執行已有的 二元搜尋樹建構類別執行,請寫出 Pseudo code。
登入後即可作答並保存紀錄。
核心觀念
本題考查二元搜尋樹(Binary Search Tree, BST)的建構,以及如何把大量資料分配給多個執行緒處理。標準 BST 插入法會逐筆插入資料;但若多個執行緒同時修改同一棵樹,可能發生競爭條件,使節點遺失或樹的指標結構錯亂。
可平行化的做法是先把輸入資料分成多批,讓各執行緒分別建構局部 BST,最後再合併局部結果。合併時必須保留 BST 的排序性質:任一節點的左子樹鍵值小於該節點,右子樹鍵值大於該節點。
解題方法
以下假設鍵值可比較、資料不含重複鍵值,且 MergeBST 能將兩棵 BST 的節點合併為一棵合法 BST。先平行建構多棵局部樹,再依序合併:
第 四 題25 分
物件導向的繼承方式主要分為單一繼承與多重繼承兩種,此兩種繼承方法優缺點各為何?JAVA 只有單一繼承,如何解決?請舉例說明。
登入後即可作答並保存紀錄。
核心觀念
繼承是讓新類別(子類別)沿用既有類別(父類別)的資料與行為,並可擴充或改寫其功能。題目要比較單一繼承與多重繼承的設計取捨,並說明 Java 如何在保留單一類別繼承的前提下,取得多種型別或行為。
- 單一繼承:一個子類別只能直接繼承一個父類別。
- 多重繼承:一個子類別可以直接繼承兩個以上的父類別。
解題方法
依序比較兩種方式的優缺點,再說明 Java 的替代機制。比較時要分清楚「類別繼承實作」與「介面宣告能力」:Java 類別只能繼承一個類別,但可以實作多個介面。
單一繼承
優點是類別階層較單純,方法來源明確,較容易維護,也能避開多重繼承中同名方法或共同祖先所造成的歧義。
缺點是類別只能沿著一條父類別路徑沿用實作;若需要結合多種類別的功能,便難以直接從多個父類別取得程式碼,可能須改以介面、組合或委派設計。
多重繼承
優點是子類別可同時沿用多個父類別的功能,表達多種「是一種」的關係,並提升程式碼重用性。
缺點是若不同父類別提供同名方法,呼叫時可能產生歧義;若兩個父類別又繼承自同一祖先,還可能出現重複繼承與狀態不一致等問題。這類問題常以「菱形繼承」說明,會增加語言規則與程式維護的複雜度。
Java 如何處理
Java 的類別採單一繼承,一個類別只能用 extends 繼承一個類別;但可以用 implements 實作多個介面。介面用來規範類別須提供哪些操作,因此可讓一個類別具備多種型別身分。若要共用實作,也可透過物件組合與委派,把功能交由其他物件處理。