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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 04:45:07