Java權限修飾符太簡單?面試官用它秒刷50%候選人!
引言
Hi,大家好,我是小米,一個熱愛分享技術的小伙伴。今天呢,我想和大家聊聊Java社招面試中一個經典又常見的問題:訪問修飾符 public, private, protected,以及默認(不寫修飾符)時的區別。
很多小伙伴一看到這個問題,可能心里就會想:哎呀,這不簡單嗎?面試官居然考這種入門級問題!但你真別小看它,稍不注意就容易掉坑!所以今天,咱們用講故事的方式,把這個問題掰開了揉碎了講清楚!
故事背景:四兄弟的權限爭奪戰
話說有一家軟件公司,里面有四位員工:Public哥、Protected哥、Default哥(也叫包權限哥)和Private哥。這四位兄弟性格迥異,各自掌管著不同的權限。某天,大家為了爭奪“誰的權限范圍最廣”的頭銜,吵了起來。
于是,項目經理提議:我們模擬幾種實際場景,看看誰的權限范圍到底有多大!
場景一:家里隨便進——全世界都能訪問(public)
Public哥第一個站出來,自信滿滿地說:
“我的權限范圍最大!誰都能訪問我,無論是公司內的同事,還是外面的陌生人,甚至是全球任何地方的用戶!”
項目經理點點頭,測試了一下,果然如此。只要public修飾的字段、方法或類,全世界任何地方都能訪問到,比如:
圖片
無論在哪個包、哪個類,只要導入了 PublicDemo,都可以直接調用 sayHello() 方法。Public哥果然不愧是權限之王。
場景二:家里人說了算——包權限(默認)
這時,Default哥站了出來,有些不服氣地說:
“別光看他耀眼,我的權限雖然不如他,但在自己的家(包)里,我說了算!誰要是和我同住一個包,隨便訪問;但只要出了包的范圍,對不起,沒門兒!”
經理又寫了一個例子:
圖片
注意,這里沒有寫修飾符!于是:
- 同一個包內的類可以隨意訪問 DefaultDemo 的字段和方法;
- 包外的類嘗試訪問時,編譯器直接報錯。
Default哥的權限范圍就是“包級訪問”,適用于那些只想在模塊內部共享的代碼。
場景三:家人和遠親——protected 的親密圈
輪到Protected哥了,他優雅地站起來:
“我呢,權限范圍比 Default 哥稍微大一點兒。除了包里的所有人可以訪問我,還有一個特權——那些和我有血緣關系的‘子類’也能訪問!”
經理覺得挺有意思,做了如下測試:
圖片
然后,在同一個包內的類可以輕松調用 sayHello()。接著,經理在另一個包寫了一個子類:
圖片
結果,子類訪問成功了!這說明 Protected哥不但允許包內訪問,還給子類開了小灶,真是個照顧子孫的好大哥。
場景四:只有我說了算——private 的嚴密防守
最后輪到Private哥,他清了清嗓子,神秘地說:
“我的權限雖然最小,但我的安全性是最強的!除了我自己,誰都別想碰我的東西!”
經理試了試:
圖片
結果顯示:
- 在 PrivateDemo 類之外,任何人都無法訪問 message 和 sayHello();
- 只有 PrivateDemo 自己可以通過 callPrivateMethod() 間接調用私有方法。
Private哥用行動證明了自己是最可靠的守護者。
四兄弟的權限總結
為了方便記憶,經理在白板上畫了一個圖表,總結了四兄弟的權限范圍:
圖片
是不是清晰又簡單?
面試中的考點
知道這些區別后,在面試中可能會遇到哪些變種問題呢?小米總結了一些常見的坑,大家可以提前練習一下!
- 類的訪問修飾符:Java 中類本身只能是 public 或默認訪問級別,不能是 private 或 protected。
- 方法覆蓋(Override)和修飾符:子類覆蓋父類方法時,訪問權限不能比父類更低。例如父類是 protected,子類覆蓋時不能改為 default 或 private。
- 構造方法的權限控制:如果構造方法是 private,外部類就無法直接創建對象。這種設計常用于單例模式。
- 接口中的字段和方法:接口中的字段默認是 public static final,方法默認是 public。
END
好了,今天的分享就到這里啦!Java 的訪問修飾符雖然看似簡單,但實際應用中經常涉及到權限設計和代碼的可維護性。如果你在面試中遇到類似問題,記得舉例說明,順便結合場景談談你的設計思路,這樣面試官會覺得你不僅懂理論,還很實戰!