父类构造方法私有化时子类无法继承,编译器直接报错;因子类必须调用可访问的父类构造方法,而private构造仅限本类内部使用;常见替代方案包括改用protected构造、静态工厂方法、组合委托或接口默认方法。

父类构造方法私有化时,子类根本无法继承该类——这不是“继承困难”,而是编译直接拒绝。
Java 规定:子类在实例化时,必须能调用到父类的一个可访问构造方法(public/protected/默认包级)。如果父类所有构造方法都是 private,子类的 super(...) 就无从下手,编译器会报错,例如:
error: Parent() has private access in Parent
这类设计通常出现在单例类、工具类或不可扩展的封闭类中(如 java.lang.Runtime),目的就是阻止继承。
为什么不能绕过私有构造?
- `private` 构造方法仅限本类内部调用,连 `super()` 都被访问控制拦在门外; - 子类不是父类的成员,不享有 `private` 的访问权限; - JVM 在创建子类对象时,必须先完成父类部分的初始化,而私有构造使这一步彻底失效。常见可行的替代方案
- **改用 protected 构造方法** 若你控制父类源码,把 `private Parent()` 改为 `protected Parent()`,子类即可通过 `super()` 正常调用。-
提供静态工厂方法 + protected 构造
保留封装性的同时支持继承:public class Parent { protected Parent() {} // 允许子类调用 private Parent(String data) { /* 内部专用 */ } public static Parent createDefault() { return new Parent(); } } 用组合代替继承
当无法修改父类时,让子类持有父类实例(private final Parent delegate;),通过委托暴露所需行为,更灵活也更安全。使用接口 + 默认方法定义契约
若目标是复用逻辑而非共享状态,提取公共行为到接口,由父子类各自实现或委托,避开构造限制。
特别注意:不要误以为“加个 public 构造就能解决一切”
- 即使父类补上 `public Parent()`,若其内部依赖 `private` 字段或初始化逻辑,强行继承仍可能导致对象处于不一致状态; - 私有构造往往伴随私有字段和不可变设计,此时继承本身可能违背原类的设计意图。所以,遇到私有构造的父类,第一反应不应该是“怎么让它能被继承”,而是:
这个类本就不是为继承设计的——我是否真的需要继承它?
立即学习“Java免费学习笔记(深入)”;


















