所以这段代码有错误,因为基类有参数吗?因为每个子类的默认构造函数调用基类的默认构造函数?并且我们没有导致错误的基类的默认构造函数?
我是否误解了它,在实现代码重用原则的同时,最好的方法是什么,因为我正在尝试在OOP中练习编程
class A {
int item;
A(int item) {
this.item = item;
}
}
class B extends A {
int subitem;
B(int item) {
super(item);
subitem = item * 2;
}
}
class C extends A {
}
答案 0 :(得分:2)
首先,关于这个问题的标题:
继承基类构造函数的子类,同时保持代码重用原则
构造函数从不继承。它不会发生。你所展示的是不是继承 - 只要求任何构造函数(java.lang.Object
中的构造函数除外)必须 链到另一个构造函数在同一个类中,或链到超类中的构造函数。
所以这段代码有错误,因为基类有参数吗?
嗯,确切地说,这是因为基类没有无参数构造函数。
因为每个子类的默认构造函数都调用基类的默认构造函数?
仅当您未明确指定任何构造函数时,才提供默认构造函数。默认构造函数总是隐式调用基类中的无参数构造函数。
我们没有导致错误的基类的默认构造函数?
我们没有基类的无参数构造函数。基本上它等同于写作:
class C extends A {
C() {
super();
}
}
如果您理解为什么 无法编译,您就会明白为什么没有任何显式声明的构造函数的版本不会编译,因为它们是等效的。
我是否误解了它,以及围绕这个
的最佳方式
围绕什么?如果不提供A
,则无法创建item
的实例。如果它做编译会很糟糕 - item
会是什么? C
的每个实例也可以被视为A
,这需要item
...
您可以编写一个无参数构造函数,它为超类构造函数提供某种默认值:
public C() {
super("default item");
}
如果这就是你想要的。但除此之外,如果不知道你想要实现什么,我们就无法真正提出替代方案。
请注意,继承远非实现代码重用的唯一方法 - 事实上,我个人更喜欢通过组合而不是继承来重用。继承是强大的,但过度使用IMO。
答案 1 :(得分:0)
你的类C
扩展A
,它必须满足在构造函数中显式调用其one-arg构造函数的契约,或者你可以简单地在你的中定义一个no-args默认构造函数A类如:
class A {
int item;
A(int item) {
this.item = item;
}
A(){
//default stuff
}
}