我想将常用的设置逻辑推迟到抽象类。公共设置逻辑是参数化的。我对它进行了摆动并制作了一个抽象构造函数:
public abstract class CondimentDecorator extends Beverage {
protected Beverage beverage;
public CondimentDecorator(Beverage beverage) {
this.beverage = beverage;
}
...
上面这个类的具体内容看起来像这样:
public class Soy extends CondimentDecorator {
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
....
这不编译。我明白了:
public class Soy extends CondimentDecorator {
^
required: Beverage
found: no arguments
reason: actual and formal argument lists differ in length
添加一个接受Beverage并调用super(饮料)的构造函数可以进行编译。我的问题是:
为什么Java在编译时看不到我对超类的构造函数非常满意并且编写public ConcreteClass(Beverage bev) {super(bev)}
是浪费时间?
奖励积分为我展示了实现这一目标的方法:)
修改:有人认为这是Why default constructor is required in a parent class if it has an argument-ed constructor?的副本 相关部分是:
如果您没有明确指定构造函数(如B),Java编译器将为您创建一个无参数构造函数:
B()
{
super();
}
感谢您指出这一点。即使这个问题确实揭示了 no-arg 构造函数实际发生的事情,但这个问题肯定不是重复的。 我仍然坐在这里思考:为什么java编译器不能看到父类已经有一个arg构造函数,并以类似于no-arg的方式为子类生成一个? 它真的不像一个膨胀的语言功能吗?
答案 0 :(得分:0)
您已为超类定义了1个参数构造函数。你没有像这样的非参数构造函数:
public CondimentDecorator() {// do something}
由于您的Soy类默认继承了CondimentDecorator构造函数,因此它只会继承带有参数的构造函数(因此警告没有参数)。您将需要手动提供一个非参数构造函数,就像我上面所示,以便编译代码。
答案 1 :(得分:0)
默认情况下,Java为您提供default constructor
(不带参数)...但是当您添加任何新构造函数时,此默认构造函数将消失。
因此,初始化超类的唯一方法是调用自己的构造函数
你的子类应首先调用你的超类的构造函数(初始化超类的字段等),然后再调用它的字段...