Java权限修饰符太简单?面试官用它秒刷50%候选人!

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

引言

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

责任编辑:武晓燕 来源: 软件求生
相关推荐

2022-01-05 08:56:20

Vue修饰符面试

2024-03-25 11:03:38

Vue修饰符lazy

2011-04-28 15:53:03

Android MarAndroid

2019-06-10 10:29:23

Java面试技巧

2009-08-24 16:49:39

C#修饰符

2020-02-25 16:56:02

面试官有话想说

2013-12-02 09:49:15

微软CEO贝茨硅谷

2022-09-22 18:31:24

Kafka

2009-06-12 13:37:47

访问权限修饰符Java教程

2022-09-24 19:09:42

面试Kafka

2022-11-24 06:33:43

表达式求值运算

2011-03-17 16:54:38

AMDCEO

2018-10-30 15:50:30

Java面试编程语言

2019-04-01 10:20:29

技术研发指标

2009-02-17 14:44:40

360安全卫士周鸿祎IT

2014-12-15 15:28:46

时代马云库克

2022-01-24 14:08:16

Redis面试命令

2015-08-18 09:25:11

Java修饰符关键词

2021-06-10 10:07:27

网络钓鱼攻击网络安全

2013-11-06 15:56:13

微软CEO鲍尔默
点赞
收藏

51CTO技术栈公众号