Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象参数构造函数_Java_Oop_Inheritance_Abstract - Fatal编程技术网

Java 抽象参数构造函数

Java 抽象参数构造函数,java,oop,inheritance,abstract,Java,Oop,Inheritance,Abstract,我想将公共设置逻辑推迟到抽象类。通用设置逻辑是参数化的。我试了一下,做了一个抽象构造器: public abstract class CondimentDecorator extends Beverage { protected Beverage beverage; public CondimentDecorator(Beverage beverage) { this.beverage = beverage; } ... 上述类的具体impl如下所示: public cl

我想将公共设置逻辑推迟到抽象类。通用设置逻辑是参数化的。我试了一下,做了一个抽象构造器:

public abstract class CondimentDecorator extends Beverage {
  protected Beverage beverage;

  public CondimentDecorator(Beverage beverage) {
    this.beverage = beverage;
  }
...
上述类的具体impl如下所示:

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
添加一个接受饮料并调用super(饮料)的构造函数可以编译此文件。我的问题是:

为什么Java在编译时看不到我对超类的构造函数非常满意,而编写
public-ConcreteClass(bev){super(bev)}
是浪费时间呢

向我展示实现此目标的方法的奖励积分:)

编辑:有人建议这是 相关部分如下:

如果不显式指定构造函数(如B中所示),Java编译器将为您创建一个无参数构造函数,如下所示:

public class Soy extends CondimentDecorator {

public String getDescription() {
  return beverage.getDescription() + ", Soy";
}
....
谢谢你指出这一点。即使这个问题确实说明了在没有arg构造函数的情况下实际会发生什么,但这个问题肯定不是重复的。 我仍然坐在这里思考:为什么java编译器不能看到父类已经有一个arg构造函数,并以与无arg构造函数类似的方式为子类生成一个arg构造函数?
它看起来真的不像是一个很棒的语言特性吗?

您已经为超类定义了一个单参数构造函数。您没有这样的无参数构造函数:

public CondimentDecorator() {// do something}

默认情况下,由于您的Soy类继承了consumentdecorator构造函数,因此它将只继承带有参数的构造函数(因此警告不要使用参数)。您需要手动提供一个非参数构造函数,如我上面所示,以使您的代码能够编译。

Java默认为您提供一个
默认构造函数(无参数)…但当您添加任何新构造函数时,此默认构造函数将消失。
因此,初始化超类的唯一方法是调用自己的构造函数。

你的子类应该首先调用你的超类的构造函数(初始化超类的字段等等),然后调用它的字段…

你不必提供一个没有参数的构造函数,在他的情况下,他可能不希望这样。就我个人而言,我喜欢expilcit编码风格,我很高兴花5秒钟让Eclipse生成您想要的构造函数。看到一个
新的ConcreteClass(beverage)
之后,我直接找到了这个构造函数的定义,而你的建议让我在层次结构中寻找有效的定义。我完全同意你明确的编码风格。但是,我认为您可以很快地查看一个类,看到它没有构造函数,然后在层次结构中向上看,就像您看到它有一个简单的super()构造函数一样