构造器可以被重写吗?
查看完整题解
参考回答
直接回答
不能。构造器不是会被子类继承的普通成员,因此不存在构造器重写。子类声明自己的构造器,可以通过 super 调用父类构造器,也可以在本类中使用不同参数列表重载构造器。这些都与覆盖一个继承的实例方法不同。
讲清原理
构造器要初始化的是新实例中属于相应类的那部分状态。子类构造器名字与子类一致,不会变成父类同名构造器的替代实现。调用父类构造器,是初始化过程中的委托,不是动态分派。
不要把“父类构造器内部调用一个可重写方法”混淆进来:那个普通实例方法仍可能分派到子类,而子类字段此时可能还没完成初始化,因此这种设计需要格外谨慎。
例子与易错点
class Parent {
Parent(int value) { System.out.println("父类 " + value); }
}
class Child extends Parent {
Child() { super(3); System.out.println("子类"); }
}
new Child(); // 先打印 父类 3,再打印 子类
子类这里没有“覆盖 Parent(int)”。给构造器加 @Override 不合法;把构造器写成带 void 的方法,也只会得到一个普通方法,不能替代初始化入口。
相关题:第 7 题、第 38 题、第 39 题、第 42 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。