Java访问权限由包和继承关系共同决定:public任何位置均可访问;protected限于同包或不同包子类;默认权限仅限同包内访问,与继承无关。

Java的访问权限控制决定了类、方法、字段等成员能在多大范围内被访问。区分public、protected和默认(包级私有)权限,关键看“谁可以访问”以及“在什么位置访问”,而不是死记修饰符含义。
public:任何地方都能访问
public是最宽松的权限。只要能通过编译(即类路径正确、导入无误),任何其他类——无论是否在同一包、是否为子类——都可以直接访问public成员。
- 例如:
java.util.ArrayList的add()方法是public,你在自己写的任意类里都能调用它 - 注意:
public类本身必须与文件同名,且一个.java文件最多只能有一个public类
protected:本包 + 子类(即使跨包)
protected比public更严格,但比默认权限更开放。它允许两种情况访问:
- 同一包内的任意类(不管是不是子类)
- 不同包中的子类(通过继承关系),但仅限于“通过子类对象访问父类的
protected成员”,不能通过父类实例直接访问
举例:假设com.a.Parent中有一个protected void show(),com.b.Child extends Parent可以重写或调用show();但如果在com.b.Other中写new Parent().show(),编译失败——即使Other和Child同包,也不具备继承关系。
立即学习“Java免费学习笔记(深入)”;
默认权限(不写修饰符):仅限本包内访问
没有写任何访问修饰符时,就是默认权限(也称包级私有,package-private)。它只对同一包下的所有类开放,和继承无关。
- 子类如果不在同一个包里,就无法访问父类的默认成员,哪怕继承了也无法调用或继承该成员
- 适合封装内部协作逻辑,比如工具类的辅助方法、框架中不希望被外部调用的钩子方法
常见误区:默认权限不是“类私有”,也不是“子类可见”,它只认包,不认父子关系。
简单对比记忆法
想象一张表格,横轴是“访问者身份”,纵轴是“所在位置”:
- 同一包内:
public✔️、protected✔️、默认 ✔️、private❌ - 不同包子类:
public✔️、protected✔️、默认 ❌、private❌ - 不同包非子类:
public✔️、其余全部 ❌
真正决定权限边界的,是“包”和“继承关系”的组合,而不是修饰符字面意思。


















