Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 为什么要执行父类init块?_Java - Fatal编程技术网

Java 为什么要执行父类init块?

Java 为什么要执行父类init块?,java,Java,据我所知,init block是在任何构造函数用于创建对象时,在该构造函数之前执行的一个块。但为什么规则与此相矛盾 class SuperClass { SuperClass() { System.out.println("Super Class constructor"); } { System.out.println("Init block of super class"); } } class Child exte

据我所知,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块被调用呢?

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

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

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

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

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

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

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

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


  • 一般遵循这个规律,

    A类{} 类B扩展了{}

    在这种情况下,

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

    B-Constructor->A的构造函数->在A的构造函数调用A的所有初始化块之前,执行A的构造函数,然后返回B的构造函数,就像它工作一样

    所以,在你的情况下

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


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

    通常遵循此规则

    A类{} 类B扩展了{}

    在这种情况下,

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

    B-Constructor->A的构造函数->在A的构造函数调用A的所有初始化块之前,执行A的构造函数,然后返回B的构造函数,就像它工作一样

    所以,在你的情况下

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


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

    只有当您认为如果构建了
    实例,父构造函数将不会被调用时,它才与此相矛盾。但10分钟的研究会告诉你,事实并非如此。只有当你认为如果构建了
    实例,父构造函数将不会被调用时,它的可能重复才会产生矛盾。但是10分钟的研究会告诉你,事实并非如此。你能回答我一件事是继承编译时还是运行时吗?如果是编译时,则表示父类属性是在编译时继承的,而不是在运行时。这不是在创建父类对象之后。询问某个对象是编译时还是运行时,某种程度上假定它是事件;继承是一个概念,同时具有编译时和运行时元素。当一个子类被实例化时,事情可能会发生在(或与)任何父类。@abhi-继承在编译时和运行时都有效。你能回答我一件事是继承编译时还是运行时吗?如果是编译时,则表示父类属性是在编译时而不是运行时继承的。这不是在创建父类对象之后。询问是编译时还是运行时在某种程度上假定它是一个事件;继承是一个概念,同时具有编译时和运行时元素。当一个子类被实例化时,任何pare都可能发生(或与之相关)事情