private→包私有→protected→public:private仅本类可见;包私有限同包;protected允同包+跨包子类继承访问(非父类引用);public无限制。注意:“default”非修饰符,应称“包私有”;protected不可通过父类实例调用。

面试时被问到“Java中四种访问修饰符的区别”,别堆砌定义,重点说清边界、讲对场景、避开常见误区。下面这种答法既准确又显思考深度,容易让面试官点头。
先说结论:按可见范围从窄到宽排个序
private → 包私有(无修饰符)→ protected → public。这个顺序对应封装强度递减、暴露程度递增。
- private:只在本类里能用。子类、同包其他类、跨包子类——统统不行。
- 包私有(不写任何修饰符):同包内所有类都能直接访问;跨包,哪怕你是子类,也不行。
- protected:同包内所有类可访问 + 跨包的子类可通过继承访问(注意:不是“跨包子类任意访问”,而是“通过子类实例或 super 调用”)。
- public:没限制。任何类、任何包、有没有继承关系,都能访问。
特别强调两个高频踩坑点
很多候选人栽在这两处,提前说清反而加分:
- “default”不是修饰符:别在面试里说“default修饰符”。Java里default是接口默认方法的关键字,和访问控制无关。正确说法是“包私有”或“不加修饰符的访问级别”。
-
protected ≠ “子类都能访问”:跨包子类只能通过继承关系访问(比如用
this.xxx或super.xxx),不能通过父类引用直接调用(比如new Parent().xxx会编译报错)。
结合一个典型例子快速验证理解
假设Parent在com.a包,Child在com.b包并继承Parent:
-
private void m1()→Child完全看不见,编译不过。 -
void m2()(包私有)→Child看不见,同理编译报错。 -
protected void m3()→Child里可以写super.m3()或直接调用m3(),但new Parent().m3()不行。 -
public void m4()→ 所有方式都允许。
顺便提一句设计意图
这不是语法琐事,而是封装策略:
- 用
private锁住核心实现细节; - 用包私有组织模块内协作(比如工具类、内部DTO);
- 用
protected为继承体系留扩展口子(比如模板方法里的钩子方法); - 用
public定义稳定对外契约(如Service接口、DTO字段)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











