为何Java中子类引用可访问父类protected构造器,父类引用却不行?
为什么protected构造器的父类无法直接实例化,但子类可以?
当父类的构造器被声明为protected时,在不同包的子类中会出现这样的现象:直接用父类引用创建对象会触发编译错误,但通过子类引用创建对象却能正常运行。
示例代码
父类(secondPackage包)
package secondPackage; public class AccessPra { protected AccessPra() { System.out.println("protected constructor"); } }
子类(firstPackage包)
package firstPackage; import secondPackage.*; public class MainClass extends AccessPra { public static void main(String[] args) { AccessPra obj1 = new AccessPra(); // 编译报错 MainClass obj2 = new MainClass(); // 正常运行 } }
原因解析
- protected访问权限的核心规则:跨包情况下,
protected成员(包括构造器)仅能在子类的上下文中,通过子类实例或子类本身访问,不能直接通过父类的引用去调用父类的protected构造器。 - 子类实例化的合法逻辑:
new MainClass()执行时,子类的默认构造器会隐式调用父类的无参构造器。此时是在子类的继承上下文中访问父类的protected构造器,符合权限规则,因此可以正常执行。 - 父类直接实例化的违规逻辑:
new AccessPra()是直接在子类的main方法中调用父类的protected构造器,属于绕过子类上下文直接访问父类的protected成员,违反了权限限制,所以编译报错。
结论
如果要实例化拥有protected构造器的跨包父类,必须通过其子类间接实现,不能直接调用父类的构造器创建对象。
内容的提问来源于stack exchange,提问作者nikhil sai
相关产品推荐
相关产品推荐

