在Java中为抽象类创建构造函数有什么用?

我想知道抽象类的构造函数的用途是什么; 因为我们没有实例化抽象类,为什么我们需要这样的构造函数?

有时您会对所有inheritance类需要设置的实例变量进行一些常见的初始化。 您在扩展它时实例化一个抽象类,并且该具体类具有一个构造函数,该构造函数将向抽象类的构造函数提供参数。

它们仍然可以由inheritance自那个的类的构造函数调用,使代码重构很好地用于在抽象类中使用构造函数。

如果在抽象类中有未初始化的最终字段,则需要在构造函数中初始化它们。

例如

abstract class A { final int x; } 

没有分配给x的构造函数将无法编译。

如果你的类没有声明构造函数,javac将为你创建一个no-arg,do-nothing构造函数。 然后,当你的子类被初始化时,它将调用生成的no-op构造函数并且生命是好的。

但是,如果你的类声明了任何构造函数,javac将不会为你创建一个。 在这种情况下,子类构造函数需要显式调用父类的构造函数。 否则,您将无法初始化父类的成员,如上面的答案所提到的那样。

抽象类的构造函数由子类使用super(params)使用super(params)从子类构造函数调用)。

您应该使这些构造函数protected以使其清晰。

您不实例化抽象类,但在实例化子类时调用构造函数。

用途可能是初始化常见属性,即。

 import java.util.List; import java.util.ArrayList; abstract class BaseClass { protected List list; // visible from subclasses public BaseClass() { System.out.println("to abstract..."); // common initialization to all subclasses list = new ArrayList(); list.add("a"); list.add("a"); list.add("a"); } } class ConcreteClass extends BaseClass { public ConcreteClass(){ // The list is initialized already System.out.println("now it is concrete and the list is: = "+ this.list ); } } class TestAbstractClass { public static void main( String [] args ) { BaseClass instance = new ConcreteClass(); } } 

产量

 $ java TestAbstractClass to abstract... now it is concrete and the list is: = [a, a, a] 

重复复制常识/行为。

例如汽车:你的所有汽车都将由一个车身,四个轮子和一个发动机构成。 因此,通过调用Body(),Wheel(int x),Engine()等函数,您可以在构造函数中为抽象Car类执行此部分构造。 每个特定的汽车类都有自己的Body(),Wheel()和Engine()实现 – 但它们都将采用相同的步骤从它们构建汽车,因此不需要在每个汽车中复制这些步骤类。 在这种情况下,您在祖先中实现了这种常见行为。

我同意,构造函数是在假设存在实例的情况下创建的。 如果您有很多常用代码,可以考虑创建一个构造函数,但将它放在init()方法中要好得多。