Hi,大家好,我是小米,一个热爱分享技术的小伙伴。今天呢,我想和大家聊聊Ja

软件求生 2024-11-29 09:56:04

 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 的访问修饰符虽然看似简单,但实际应用中经常涉及到权限设计和代码的可维护性。如果你在面试中遇到类似问题,记得举例说明,顺便结合场景谈谈你的设计思路,这样面试官会觉得你不仅懂理论,还很实战! 我是小米,一个喜欢和大家分享技术的程序员。欢迎点赞、转发、关注!我们下次再聊~ 我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!

0 阅读:0
软件求生

软件求生

从事软件开发,分享“技术”、“运营”、“产品”等。