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

protected 成员可以在子类中直接访问,无论子类与父类是否在同一个包中。
子类中访问 protected 成员的基本规则
Java 中 protected 修饰的字段、方法或构造器,对子类是“可见且可访问”的,只要满足以下任一条件:
- 子类与父类在同一个包内 —— 此时 protected 行为等同于 package-private(默认权限);
- 子类与父类不在同一个包内 —— 仍可通过继承关系访问父类的 protected 成员,但只能通过子类自身或其对象访问,不能通过其他父类实例访问。
正确访问方式:通过 this 或子类实例
在子类内部,可以直接使用 this.成员名 或省略 this 直接调用:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
// 父类(包: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 成员:
-
new Animal().name→ 编译错误(跨包时); -
Animal a = new Animal(); a.name;→ 同样编译失败(即使 a 是 Animal 类型); - 只有当访问发生在“当前子类实例的继承链上下文”中才被允许。
补充说明:构造器与静态成员
protected 构造器 可被子类调用(通过 super(...)),但不能被包外非子类调用。
protected 静态成员 的访问规则和普通 protected 成员一致:子类可直接使用类名或隐式通过子类访问,如 Dog.count(若父类定义了 protected static int count)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










