为啥Java中的抽象类有构造函数? [复制]
Posted
技术标签:
【中文标题】为啥Java中的抽象类有构造函数? [复制]【英文标题】:Why do abstract classes in Java have constructors? [duplicate]为什么Java中的抽象类有构造函数? [复制] 【发布时间】:2011-01-11 08:19:18 【问题描述】:为什么 Java 中的 abstract
类有 constructor
?
它在构造什么,因为我们无法实例化 abstract
类?
有什么想法吗?
【问题讨论】:
查看这个问题以获得澄清,***.com/questions/260666/… 你需要一种方法来构造抽象类的子类。从技术上讲,抽象类上的公共构造函数实际上只是一个受保护的构造函数。 【参考方案1】:我想这个问题的根源是人们相信对构造函数的调用会创建对象。事实并非如此。 Java 没有任何地方声称构造函数调用会创建一个对象。它只是做我们想让构造函数做的事情,比如初始化一些字段……就是这样。所以一个抽象类的构造函数被调用并不意味着它的对象被创建了。
【讨论】:
【参考方案2】:这有两个原因:
1) 抽象类具有constructors
,并且在实例化具体子类时始终调用这些构造函数。我们知道,当我们要实例化一个类时,我们总是使用该类的构造函数。现在每个构造函数都会调用其超类的构造函数,隐式调用super()
。
2) 我们知道构造函数也用于初始化类的字段。我们也知道抽象类可能包含字段,有时需要使用构造函数以某种方式初始化。
【讨论】:
Debmalya Das (SCJP & SCWCD)【参考方案3】:因为抽象类具有状态(字段)和某些情况,所以它们需要以某种方式进行初始化。
【讨论】:
【参考方案4】:在实现方面,您经常会在子类构造函数中看到 super() 语句,如下所示:
public class A extends AbstractB
public A(...)
super(String constructorArgForB, ...);
...
【讨论】:
【参考方案5】:因为另一个类可以扩展它,而子类需要调用超类的构造函数。
【讨论】:
【参考方案6】:Java 中的构造函数实际上并不“构建”对象,它用于初始化字段。
假设您的抽象类有字段 x 和 y,并且您总是希望它们以某种方式初始化,无论最终创建的是什么实际的具体子类。所以你创建一个构造函数并初始化这些字段。
现在,如果你的抽象类有两个不同的子类,当你实例化它们时,它们的构造函数将被调用,然后父构造函数将被调用并初始化字段。
如果你什么都不做,就会调用父级的默认构造函数。但是,您可以使用 super 关键字来调用父类上的特定构造函数。
【讨论】:
通常情况下,如果考虑构造函数链的理论,那么在子构造函数执行之前先调用父构造函数Now, if you have two different subclasses of your abstract class, when you instantiate them their constructors will be called, and then the parent constructor will be called and the fields will be initialized.
你的意思是第一个子类的构造函数会被调用? :O
每次都是这样流动的-grand parent constructor
->parent constructor
->child constructor
@Stranger "父构造函数在子构造函数执行之前首先被调用" 我想了解更多关于这个的信息并学习java构造函数链接的理论。你有什么有用的链接或电子书之类的吗?【参考方案7】:
包括抽象类在内的所有类都可以有构造函数。抽象类的构造函数会在其具体子类被实例化时被调用
【讨论】:
以上是关于为啥Java中的抽象类有构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我们需要复制构造函数以及何时应该在 java 中使用复制构造函数