Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,我们如何知道super()在构造函数中何时完成?_Java_Swing_Constructor_Jtable_Super - Fatal编程技术网

在Java中,我们如何知道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()完成后安全

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命名约定,并在初始化过程中坚持主题表将触发表示表数据已更改的事件。跳过这些方法是正常的。我如何避免?