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