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方法,不能直接通过父类的实例调用该方法。
具体到这个例子:
protectedMethod()直接调用合法,这里隐含了this.protectedMethod(),也就是通过A自身的实例访问继承来的方法,符合权限规则。- 而
a2.protectedMethod()是通过A2的实例调用方法——A2是A的直接父类,且A2、A都和B不在同一个包。此时A作为子类,只能访问自己继承得到的protected方法,没有权限通过A2的实例去访问它从B继承来的protected成员,因为这相当于绕过了A自身的继承身份,直接访问不同包中父类的protected方法,违反了权限规则。
内容的提问来源于stack exchange,提问作者bc a
相关产品推荐
相关产品推荐

