protected成员可在子类中直接访问,无论是否同包;同包时等效默认权限,跨包时仅可通过this或子类实例访问,不可通过其他父类实例访问。

protected 成员可以在子类中直接访问,无论子类与父类是否在同一个包中。
子类中访问 protected 成员的基本规则
Java 中 protected 修饰的字段、方法或构造器,对子类是“可见且可访问”的,只要满足以下任一条件:
- 子类与父类在同一个包内 —— 此时 protected 行为等同于 package-private(默认权限);
- 子类与父类不在同一个包内 —— 仍可通过继承关系访问父类的 protected 成员,但只能通过子类自身或其对象访问,不能通过其他父类实例访问。
正确访问方式:通过 this 或子类实例
在子类内部,可以直接使用 this.成员名 或省略 this 直接调用:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
// 父类(包:com.example.base)
package com.example.base;
public class Animal {
protected String name = "unknown";
protected void speak() {
System.out.println("Animal speaks");
}
}
// 子类(包:com.example.dog)
package com.example.dog;
import com.example.base.Animal;
public class Dog extends Animal {
public void show() {
System.out.println(this.name); // ✅ 正确:通过 this 访问
System.out.println(name); // ✅ 正确:省略 this 也允许
this.speak(); // ✅ 正确:调用 protected 方法
speak(); // ✅ 正确:同样允许
}
}
常见错误:不能通过其他父类实例访问
即使在子类中,也不能用一个“非本类创建的”父类对象访问其 protected 成员:
立即学习“Java免费学习笔记(深入)”;
-
new Animal().name→ 编译错误(跨包时); -
Animal a = new Animal(); a.name;→ 同样编译失败(即使 a 是 Animal 类型); - 只有当访问发生在“当前子类实例的继承链上下文”中才被允许。
补充说明:构造器与静态成员
protected 构造器 可被子类调用(通过 super(...)),但不能被包外非子类调用。
protected 静态成员 的访问规则和普通 protected 成员一致:子类可直接使用类名或隐式通过子类访问,如 Dog.count(若父类定义了 protected static int count)。

















