You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同包中子类调用父类protected方法为何编译失败?

Java不同包子类中protected方法访问问题解析

先看你的代码:

// package animal;
public class Frog {
  protected void ribbit() { }
  void jump() { }
}

// package other;
import animal.*;
public class Tadpole extends Frog {
  public static void main(String[] args) {
    Tadpole t = new Tadpole();
    t.ribbit(); // 编译通过
    t.jump(); // 编译失败:默认包私有权限,跨包不可访问
    Frog f = new Tadpole();
    f.ribbit(); // 编译失败,核心疑问点
    f.jump(); // 编译失败:默认包私有权限,跨包不可访问
  } 
}

核心原因:protected权限的访问限制规则

你对protected权限的理解有偏差——不同包的子类并非在任何场景下都能访问父类的protected成员,关键看访问的"载体":

  • 当子类与父类不在同一包时,子类仅能通过**自身类的实例(或this/super)**来访问父类的protected成员;
  • 不能通过父类类型的引用(哪怕这个引用实际指向子类对象)来访问父类的protected成员。

对应代码中的情况

  1. 第6行t.ribbit()编译通过:t是子类Tadpole的实例,子类可以直接访问自身实例继承来的父类protected方法,符合规则。
  2. 第9行f.ribbit()编译失败:f是父类Frog类型的引用,此时是通过父类类型来发起访问,而两个类分属不同包,这种访问方式违反了protected的权限约束,因此编译报错。

补充protected的完整访问规则

  • 同包内的所有类,都可以访问该类的protected成员(和默认权限范围一致);
  • 不同包的子类中:
    • 允许通过子类实例访问继承得到的protected成员;
    • 允许通过super关键字访问父类的protected成员;
    • 禁止通过父类类型的引用访问protected成员,无论该引用是否指向子类对象。

内容的提问来源于stack exchange,提问作者motodev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:53:16