子类可直接访问父类protected成员,同包时还可非继承式访问;不同包下仅限继承访问,禁止通过父类实例调用;重写时访问权限不可缩小,static protected成员遵循相同规则。

子类可以直接访问父类中声明为 protected 的成员(字段、方法、构造器),前提是访问发生在继承关系内,且不违反封装边界。
protected 成员的可见性规则
protected 修饰符介于 private 和 public 之间:它允许同一包内的所有类访问,也允许不同包中的子类访问——但仅限于通过继承方式(即子类自身或其对象调用),不能通过其他父类实例间接访问。
- 子类在本类内部可直接使用
super.xxx或直接写xxx(若无重名)访问父类 protected 字段或方法 - 不同包下的子类无法通过
new 父类().xxx访问 protected 成员,这会编译报错 - 如果子类与父类同包,则除了继承访问外,还能像普通包内类一样直接访问父类 protected 成员(即使不通过继承)
常见写法示例
假设父类 Animal 在 com.example.base 包中定义:
package com.example.base;
public class Animal {
protected String name = "unknown";
protected void breathe() {
System.out.println("breathing...");
}
}
子类 Dog 在 com.example.pet 包中继承它:
package com.example.pet;
import com.example.base.Animal;
public class Dog extends Animal {
public void printInfo() {
System.out.println(name); // ✅ 直接访问 protected 字段
breathe(); // ✅ 直接调用 protected 方法
System.out.println(super.name); // ✅ 显式用 super 访问(必要时消歧义)
}
}
注意重写与访问权限
子类重写父类 protected 方法时,覆写后的方法可以保持 protected,也可以扩大为 public,但不能缩小为 private 或 package-private(默认),否则编译失败。
- 这是为了保证里氏替换原则:子类对象必须能替代父类对象被安全使用
- 如果父类方法是 protected,子类方法声明为 public 是合法且常见做法(提升可见性)
静态 protected 成员的访问
static 的 protected 成员同样遵循上述规则。子类可通过类名或 super 访问,但推荐用 父类名.成员 或直接使用(若无冲突)。
- 例如:
Animal.COUNT或super.COUNT(如果 COUNT 是 static protected 字段) - 不建议用
this.COUNT,因为静态成员属于类而非实例,语义不清
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











