当前位置: 首页 > 知识库问答 >
问题:

为什么要执行父类init块?

魏翰
2023-03-14

据我所知,init block是一个在任何构造函数之前执行的块,每当该构造函数用于创建对象时。但是为什么规则在这里矛盾......

class SuperClass
{
    SuperClass()
    {
        System.out.println("Super Class constructor");
    }

    {
        System.out.println("Init block of super class");
    }
}

class Child extends SuperClass
{
    Child()
    {
        super();
        System.out.println("Child Class constructor");
    }

    public static void main(String s[])
    {
        Child c1=new Child();
    }
}

这里,由于只形成了子类对象,那么为什么要调用父类的init块呢?

共有3个答案

左华灿
2023-03-14

一般遵循这个规则,

类A{}类B扩展了A{}

在这种情况下,

当B对象实例化时,调用的顺序也是如此,

B-建造师-

所以,在你的情况下,

子对象首先调用子构造函数,但在转到它之前,它转到了超类构造函数,在继续之前是第一个,如果有任何初始化块,那么它在这里完成。

所以,超类初始化块首先执行,然后执行超类的构造函数,最后执行子构造函数。

柴宝
2023-03-14

您可以通读本主题的JLS 12.5。检查初始化顺序的步骤3和4

此构造函数不会以同一类中另一个构造函数的显式构造函数调用开始(使用此函数)。如果此构造函数用于对象以外的类,则此构造函数将以超类构造函数的显式或隐式调用(使用super)开始。使用相同的五个步骤递归地评估超类构造函数调用的参数和过程。如果构造函数调用突然完成,那么此过程也会因为同样的原因突然完成。否则,继续执行步骤4。

执行该类的实例初始化程序和实例变量初始化程序,将实例变量初始化程序的值按从左到右的顺序分配给相应的实例变量,它们以文本方式出现在类的源代码中。如果执行这些初始化程序中的任何一个导致异常,则不再处理其他初始化程序,并且此过程会在相同的异常下突然完成。否则,继续步骤5。

游安康
2023-03-14

子类取决于父类超类。它从父级获取/继承属性。因此,要构造子对象,必须首先构造父对象。这就是调用超类init块和构造函数的原因。

 类似资料:
  • 我已经编写了以下代码,并为这个超类创建了对象。 当我检查输出时,如下所示: 我知道只有在初始化类的对象或进行任何静态引用时,才会执行静态块。但在这里,我并没有把这些都带到课堂上。那么为什么我会看到“sub”即sub类的静态块输出?

  • 《Java并发实践》(Brian Goetz)中对此进行了阐述(重点是我的): 当Future.get抛出中断或超时异常,并且您知道程序不再需要结果时,请用F取消任务uture.cancel Javadoc for Future.get声明(突出显示的是我的): 抛出InterruptedException-如果当前线程在等待时被中断 因此,据我所知:如果我得到InterruptedExcepti

  • 问题内容: 使用Promises时,为什么不能在代码库的其他地方触发并定义? 我不明白为什么,应该在声明诺言的地方本地化逻辑。这是疏忽大意,还是强制执行此参数有好处吗? 我相信执行程序功能应该是可选的,并且它的存在应该确定promise是否封装了解决方案。没有这样的授权,promise的可扩展性就更大,因为您不必立即启动异步。承诺也应该是可重置的。这是1档开关,1或0 或。可以附加许多平行和顺序的

  • 问题内容: 这是我的代码: 如果删除,该表不会更新。但是对于select语句,我不需要那个。我很好奇为什么? 问题答案: 在DB- API 规范要求连接到数据库开始新的事务,默认情况下。您必须确认所做的任何更改,或放弃它们。 请注意,如果数据库支持自动提交功能,则必须首先将其关闭。 纯语句,因为它们从不对数据库进行任何更改,因此不必提交更改。

  • 问题内容: 这是代码 我期望的输出是: 但实际上是: 看来Child类中的静态块没有得到执行,但是为什么呢?这是反直觉的,不是吗? 补充: 为了更清楚,我列出了 2 __以下 1 分: 正如@axtavt所说,根据JLS 12.4.1,类Child已加载,但未初始化。 但是@Alexei Kaigorodov指出,根据 jvms-5.5,应初始化Child类,因为对Child类执行了getstat

  • 我在准备Java亚奥理事会考试。上面的代码来自我现在正在学习的书。根据答案,结果应该是 虽然我希望它是 考虑到这些规则: 静态初始化块在第一次加载类时运行 正常的init块在所有超级构造函数运行后立即运行 谁能一步一步地告诉我这是怎么发生的吗?我可以理解和在所有事情之前,但为什么就在它们之后?