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

protected方法子类访问范围解析:为何a2.protectedMethod()编译失败?

关于protected方法跨继承访问的编译错误问题

前提说明

  • class A2 与 public class A 位于同一个 A.java 文件中
  • class B 处于与 A.java 不同的包下

Class B 代码

public class B {
    protected void protectedMethod() {
    }
}

A.java 文件代码

class A2 extends B {
    void tFunc() {
        protectedMethod();
    }
}

public class A extends A2 {
    void tFunc1() {
        protectedMethod(); // OK
        A2 a2 = new A2();
        a2.protectedMethod(); // Compile Error
    }
}

问题

已知protected方法可通过继承关系访问,为何当A继承A2、A2继承B时,调用 a2.protectedMethod() 会出现编译错误?

原因解释

这是因为Java对protected权限的访问有明确限制,不是只要有继承关系就能随意通过父类实例调用:

  • 跨包场景下,子类只能通过自身实例(隐含的this)或者子类的实例来访问继承自父类的protected方法,不能直接通过父类的实例调用该方法。

具体到这个例子:

  1. protectedMethod() 直接调用合法,这里隐含了this.protectedMethod(),也就是通过A自身的实例访问继承来的方法,符合权限规则。
  2. 而a2.protectedMethod()是通过A2的实例调用方法——A2是A的直接父类,且A2、A都和B不在同一个包。此时A作为子类,只能访问自己继承得到的protected方法,没有权限通过A2的实例去访问它从B继承来的protected成员,因为这相当于绕过了A自身的继承身份,直接访问不同包中父类的protected方法,违反了权限规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:45:48