不同包中子类调用父类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成员。
对应代码中的情况
- 第6行
t.ribbit()编译通过:t是子类Tadpole的实例,子类可以直接访问自身实例继承来的父类protected方法,符合规则。 - 第9行
f.ribbit()编译失败:f是父类Frog类型的引用,此时是通过父类类型来发起访问,而两个类分属不同包,这种访问方式违反了protected的权限约束,因此编译报错。
补充protected的完整访问规则
- 同包内的所有类,都可以访问该类的protected成员(和默认权限范围一致);
- 不同包的子类中:
- 允许通过子类实例访问继承得到的protected成员;
- 允许通过
super关键字访问父类的protected成员; - 禁止通过父类类型的引用访问protected成员,无论该引用是否指向子类对象。
内容的提问来源于stack exchange,提问作者motodev
相关产品推荐
相关产品推荐

