繁体   English   中英

大括号下的语句是否首先加载?

[英]Are statements under curly braces load first?

我知道首先将静态内容加载到内存中,但是为什么当我没有提到它为静态时,为什么在“ CT”之前打印“ IT”呢?

class Person
{
    Person()
    {
        System.out.print(" CP");
    }

    static 
    {
        System.out.print("SP");
    }
}

class Teacher extends Person
{
    Teacher()
    {
        System.out.print(" CT");
    }

    {
        System.out.print(" IT");
    }
}


public class StaticTest 
{
    public static void main(String[] args) 
    {       
        Person p = new Teacher();
    }
}

初始化程序块,例如{System.out.print(" IT");} ,在构造函数之前执行。 实际上,它们被复制到每个构造函数的开头。

初始化实例成员

通常,您需要将代码放在构造函数中以初始化实例变量。 使用构造函数初始化实例变量有两种选择: 初始化块和final方法。

实例变量的初始化程序块看起来像静态初始化程序块,但没有static关键字

{
//初始化所需的任何代码都在这里
}

Java编译器将初始化程序块复制到每个构造函数中。 因此,该方法可用于在多个构造函数之间共享代码块。

来源

更确切地说,这是JLS中描述的初始化顺序:

  1. 将构造函数的参数分配给此构造函数调用的新创建的参数变量。

  2. 如果此构造函数以同一个类中的另一个构造函数的显式构造函数调用(第8.8.7节)开头(使用此方法),则使用这五个步骤评估参数并递归处理该构造函数调用。 如果该构造函数调用突然完成,则该过程由于相同的原因突然完成; 否则,请继续执行步骤5。

  3. 此构造函数并不以对同一类中的另一个构造函数的显式构造函数调用(使用此函数)开头。 如果此构造函数用于Object以外的其他类,则此构造函数将以显式或隐式调用超类构造函数(使用super)开始。 使用这五个相同的步骤,递归评估超类构造函数调用的参数和过程。 如果该构造函数调用突然完成,则出于相同原因,此过程也会突然完成。 否则,请继续执行步骤4。

  4. 执行此类的实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值按从左到右的顺序在文本中显示在该类的源代码中,然后将其分配给相应的实例变量。 如果执行这些初始化程序中的任何一个导致异常,则不会再处理其他初始化程序,并且该过程会因相同的异常而突然完成。 否则,请继续执行步骤5。

  5. 执行此构造函数的其余部分。 如果该执行突然完成,则出于相同原因,此过程也会突然完成。 否则,此过程将正常完成。

请注意,实例构造函数在构造函数的主体(步骤5)之前在步骤4中执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM