protected是限定继承可见性的设计工具,允许子类访问父类成员但禁止跨包通过父类引用调用;合法访问需满足:本类内、同包任意类、不同包子类且通过子类实例调用。

protected修饰符不是“让子类随便用”的快捷键,而是有明确边界的设计工具——它允许子类继承并访问父类成员,但禁止通过父类引用跨包调用,核心在于“继承可见性”而非“无条件可见”。
protected的合法访问场景
只有满足以下任一条件,才能访问protected成员:
- 在声明该成员的类内部(直接使用)
- 在同一个包下的任意类中(无论是否继承)
- 在不同包中的子类里,且必须通过当前子类实例(或其子类实例)调用,不能用父类类型变量引用
子类中正确访问protected成员
子类可直接使用继承来的protected字段和方法,就像它们是自己定义的一样:
- 在子类实例方法、构造器或初始化块中,直接写
name = "Lily"或makeSound() - 无需加
super.前缀(除非存在同名遮蔽) - 子类也可重写protected方法,并保持相同或更宽松的访问级别(如改为public)
常见错误:跨包子类误用父类引用
这是最典型的编译错误。例如:
立即学习“Java免费学习笔记(深入)”;
- 子类
Dog在com.pet包,父类Animal在com.animal包 -
Dog d = new Dog(); d.makeSound();✅ 合法(通过子类实例) -
Animal a = new Dog(); a.makeSound();❌ 编译失败(a是Animal类型,跨包不可见)
与private、public、default的对比要点
理解差异能避免滥用:
- private:仅本类可用,子类完全不可见
- default(包级):同包可见,但跨包子类也访问不到
- protected:同包 + 跨包子类(仅限继承调用)
- public:无限制,任何地方都可访问


















