为什么Java中的抽象类具有构造函数?

Why do abstract classes in Java have constructors?

本问题已经有最佳答案,请猛点这里访问。

为什么Java中的EDCOX1×0类具有EDCOX1?1?

它在构造什么,因为我们不能实例化一个abstract类?

有什么想法吗?


Java中的构造函数实际上不"构建"对象,它用于初始化字段。

假设您的抽象类有字段x和y,并且您总是希望以某种方式初始化它们,不管最终创建了什么实际的具体子类。所以创建一个构造函数并初始化这些字段。

现在,如果抽象类有两个不同的子类,则在实例化它们时,将调用它们的构造函数,然后调用父构造函数并初始化字段。

如果不执行任何操作,将调用父级的默认构造函数。但是,可以使用super关键字在父类上调用特定的构造函数。


包括抽象类在内的所有类都可以有构造函数。当其具体子类将被实例化时,将调用抽象类构造函数。


原因有两个:

1)抽象类具有constructors,并且在实例化具体的子类时总是调用这些构造函数。我们知道,当我们要实例化一个类时,我们总是使用该类的构造函数。现在,每个构造函数都通过隐式调用super()来调用其超级类的构造函数。

2)我们知道构造函数也用于初始化类的字段。我们还知道抽象类可能包含字段,有时需要使用构造函数以某种方式初始化它们。


因为另一个类可以扩展它,而子类需要调用一个超类构造函数。


因为抽象类有状态(字段)和一些时间,所以它们需要以某种方式初始化。


我猜这个问题的根源在于人们相信对构造函数的调用会创建对象。事实并非如此。Java无需声明构造函数调用创建对象。它只是执行我们希望构造函数执行的操作,比如初始化一些字段……仅此而已。所以一个抽象类的构造函数被调用并不意味着它的对象是被创建的。


在实现方面,您经常会在子类构造函数中看到super()语句,例如:

1
2
3
4
5
6
7
8
9
10
<wyn>
public class A extends AbstractB{

  public A(...){
     super(String constructorArgForB, ...);
     ...
  }
}

</wyn>