Java 抽象类中的构造函数

Java 抽象类中的构造函数,java,constructor,abstract-class,Java,Constructor,Abstract Class,我正在用Java制作一个图形库,我知道已经有很多了 我有一个抽象的类图,它有宽度和高度的变量以及绘制比例的方法,还有一个抽象的方法来绘制图形。我有多个扩展Graph类的类,如LineGraph、BarGraph等,它们有一个绘制图形的方法 由于在创建一个新的图实例时需要设置图的宽度和高度,所以我希望在构造函数中进行设置,但在尝试Eclipse时,仍然希望在每个类中创建一个单独的构造函数。有可能有一个带有构造函数的抽象类吗?你会怎么做呢?你可以在抽象类中有一个宽度和高度的构造函数。但仍然需要在每个

我正在用Java制作一个图形库,我知道已经有很多了

我有一个抽象的类图,它有宽度和高度的变量以及绘制比例的方法,还有一个抽象的方法来绘制图形。我有多个扩展Graph类的类,如LineGraph、BarGraph等,它们有一个绘制图形的方法


由于在创建一个新的图实例时需要设置图的宽度和高度,所以我希望在构造函数中进行设置,但在尝试Eclipse时,仍然希望在每个类中创建一个单独的构造函数。有可能有一个带有构造函数的抽象类吗?你会怎么做呢?

你可以在抽象类中有一个宽度和高度的构造函数。但仍然需要在每个派生类中都有构造函数,这些派生类采用宽度和高度,但将处理委托给超类

你可能需要做下面给出的事情

public abstract class Graph {
   public Graph(int width, int height) {
       // do actual things with width and height
   }
}

public class LineGraph extends Graph{
   public LineGraph(int width, int height) {
      super(width, height);
      // additional inits.
   }
}

public class BarGraph extends Graph{
   public BarGraph(int width, int height) {
      super(width, height);
      // additional inits.
   }
}

这不是日食。是Java编译器迫使你这么做的。如果您已经在抽象类中定义了构造函数。必须从派生类调用该构造函数。

对于每个子类,您需要创建一个具有相同签名或不具有超级签名的构造函数,因此如果您不希望子类的构造函数中出现任何行为,只需添加超级

例如:

abstract class Graph {
  int width;
  int height;

  public Graph(int width, int height) {
    this.width = width;
    this.height = height;
  }
}

class LinearGraph extends Graph {
  public LinearGraph(int width, int height) {
    super(width, height);
  }
}

抽象中具有构造函数的概念有助于程序员将属性分配给所有继承的子类

通常人们使用抽象构造函数来初始化一些可以在其子类中使用的属性

现在,如果在您的场景中您想这样做,您可以使用此策略


你可以参考这篇文章来更好地理解这个概念->

如果你使用继承,那么你可以使用基类构造函数来分配高度和宽度的值。
但在这种情况下,您需要在基类中使用默认构造函数和参数化构造函数,或者必须从派生类调用基类的参数化构造函数。

如果OP必须执行特定于每个图形派生类的初始化,则可能重复“是”,调用super之后,可以在其构造函数中执行相同的操作。这不是说:“您需要创建具有相同签名的构造函数”,因为如果您在子构造函数中使用super关键字调用父类并传递static,则可以使用其抽象超类定义具有不同构造函数签名的子类类变量作为参数。