面試經典題:「子類繼承父類所有非私有屬性和方法,這句話對嗎?」若回答「對」,則掉入陷阱。關鍵在於 「非私有」的定義 與 包訪問權限的隱性限制。
| 修飾符 | 同類 | 同包 | 異包子類 | 異包非子類 |
|---|---|---|---|---|
public | ✓ | ✓ | ✓ | ✓ |
protected | ✓ | ✓ | ✓ | ✗ |
default (包私有) | ✓ | ✓ | ✗ | ✗ |
private | ✓ | ✗ | ✗ | ✗ |
「非私有」≠「可被子類繼承」
default (包私有) 成員屬於「非私有」,但 異包子類不可見,故無法繼承。protected 才是「默認 + 異包子類可見」的組合。因此正確表述應為:子類繼承父類所有 public、protected 以及同包下的 default 成員。
題目變體:「實現類繼承父介面所有非私有屬性和方法對嗎?」
public static final (屬性) / public abstract (方法)private 介面方法,但屬性仍隱含 public static final。可編寫測試類驗證修飾符行為:
static:子類能否用類名直接調用final:子類能否修改屬性值abstract:介面中能否寫具體方法 (Java 8 default 方法)public:普遍可見性驗證public 走天下,protected 留給兒子和同包,
default 只認包不認兒子,private 鎖家門。
本系列將持續收錄 Java 開發中易混淆、易遺忘的核心知識點,歡迎持續關注。