首先,关于这个问题的标题:
子类继承基类构造函数,同时保持代码重用原则
构造函数永远不会被继承。它只是不会发生。您一直在演示的不是继承——它只是要求任何构造函数(除了 in 中的构造函数java.lang.Object
)必须链接到同一类中的另一个构造函数,或者链接到超类中的构造函数。
所以这段代码有错误,因为基类有参数对吗?
嗯,准确的说,是因为基类没有无参数的构造函数。
因为每个子类的默认构造函数都调用了基类的默认构造函数?
仅当您未明确指定任何构造函数时才提供默认构造函数。默认构造函数总是隐式调用基类中的无参数构造函数。
并且我们没有导致错误的基类的默认构造函数?
我们没有基类的无参数构造函数。基本上它相当于写:
class C extends A {
C() {
super();
}
}
如果你理解为什么它不能编译,你就会理解为什么没有任何显式声明的构造函数的版本不能编译,因为它们是等价的。
我误会了吗,还有什么是最好的解决方法
围绕什么?如果A
不提供item
. 如果它确实编译会很糟糕 - 那会item
是什么?的每个实例C
也可以被认为是一个A
,这需要一个item
...
您可以编写一个无参数构造函数,为超类构造函数提供某种默认值:
public C() {
super("default item");
}
如果那是你想要的。但除此之外,如果不知道您要达到的目标,我们就无法真正提出替代方案。
请注意,继承远非实现代码重用的唯一方法——事实上,我个人更喜欢通过组合重用,而不是一般的继承。继承功能强大,但过度使用了 IMO。