在Java中,我们如何知道super()在构造函数中何时完成?
AFAIK:创建子类时,所有构造函数都隐式或显式调用super() 例如: class subclass extends superclass { public subclass() { super(); // unnecessary, but explicit } 类子类扩展了超类{ 公共子类(){ super();//不必要,但显式 } 我如何知道super()何时完成?我正在创建JTable的一个子类,该子类需要自动调整列,但只能在super()完成后安全地进行调整 --编辑--在Java中,我们如何知道super()在构造函数中何时完成?,java,swing,constructor,jtable,super,Java,Swing,Constructor,Jtable,Super,AFAIK:创建子类时,所有构造函数都隐式或显式调用super() 例如: class subclass extends superclass { public subclass() { super(); // unnecessary, but explicit } 类子类扩展了超类{ 公共子类(){ super();//不必要,但显式 } 我如何知道super()何时完成?我正在创建JTable的一个子类,该子类需要自动调整列,但只能在super()完成后安全
为了根据下面的注释进行澄清,假设super()还将调用一些类方法。我可能会在我的子类中重写其中一些方法。我想在基类构造期间修改这些方法中的行为。也许某些必需的成员还不会(完全)被调用初始化…如果创建了子类实例,Super将完成。如果Super()没有完成,它将不会毫无例外地返回以完成子类的构造函数-即,如果Super调用没有完成,您将永远不会实例化子类。在
Super()之后调用代码如何
完成时如下所示:
class subclass extends superclass {
public subclass() {
super(); // unnecessary, but explicit
callYourFunctionHereKnowingThatSuperHasFinished();
}
}
super()
因此,每个构造函数中都包含一个隐含的super()
不包括this()函数或显式super()
super()语句调用
超类的构造函数。可以替换隐式super()
通过显式super()执行。super语句必须是第一个
构造函数的语句
由于JVM将等待第一条语句完成,因此您的第二条语句可以安全地操作对象或随意调用super.methods()
。super()
调用结束时,对super()
的调用返回(这同样适用于任何其他方法调用)
如果按照示例显式调用它,则当到达super()
调用后的行时,super()
已完成执行。如果允许隐式调用它,则当执行到达构造函数中的第一行时,super()
已完成
当然,在这种情况下,super()
可能会产生一个或多个后台线程,这些线程执行各种任务,并且在调用super()
返回时仍在执行。但这与调用super()无关
。在这种情况下,其他任务完成的时间与调用super()
完成的时间没有任何关系。如果你想自动调整列的大小,你应该在数据模型之后观察。数据在那里。你正在谈论的东西被调用
每个构造函数方法都将调用链,直到到达并初始化顶部的类。然后,当链向下卷绕到原始子类时,初始化下面的每个后续类。此过程称为构造函数链接
因此,是的,您可以在原始子类的构造函数中调用super()之后安全地添加您的方法
…假设super()还将调用一些类方法。我可以重写
我的子类中的一些方法
简单的回答是“不要这样做”。这太疯狂了。当你到达super()之后的那一行时,它就结束了。
你甚至不能在super()调用之前写任何代码,那么这里到底是什么问题呢?也许他在问如果你不显式地写super()
,会发生什么,或者为什么(在文档中它是这样说的)您不能在调用之前编写代码?请学习java命名约定,并在初始化过程中坚持主题表将触发表示表数据已更改的事件。跳过这些方法是正常的。我如何避免?