引言
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 的访问修饰符虽然看似简单,但实际应用中经常涉及到权限设计和代码的可维护性。如果你在面试中遇到类似问题,记得举例说明,顺便结合场景谈谈你的设计思路,这样面试官会觉得你不仅懂理论,还很实战!