花括号首先加载语句吗?

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

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");}在构造函数之前执行。 实际上,它们被复制到每个构造函数的开头。

初始化实例成员

通常情况下,您会将代码初始化为构造函数中的实例变量。 使用构造函数初始化实例变量有两种选择: 初始化块和最终方法。

实例变量的初始化块与静态初始化块类似,但没有static关键字

{
//无论初始化所需的代码都在这里
}

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

(资源)

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

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

  • 如果这个构造函数以相同类中另一个构造函数的显式构造函数调用(第8.8.7.1节)开始(使用这个),则使用这五个相同的步骤来评估参数并递归构造函数调用。 如果构造函数的调用突然完成,则此过程由于同样的原因突然完成; 否则,继续执行步骤5。

  • 这个构造函数不是从同一个类中的另一个构造函数的显式构造函数调用开始的(使用这个)。 如果此构造函数用于Object以外的类,则此构造函数将以显式或隐式调用超类构造函数(使用super)开始。 评估参数并使用这五个相同的步骤递归地处理该超类构造函数的调用。 如果构造函数的调用突然完成,那么出于同样的原因,此过程会突然完成。 否则,请继续步骤4。

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

  • 执行此构造函数的其余部分。 如果该执行突然完成,则此过程因相同原因突然完成。 否则,此过程正常完成。

  • 请注意,实例初始化程序在构造函数的主体之前的第4步中执行(第5步)。

    链接地址: http://www.djcxy.com/p/10201.html

    上一篇: Are statements under curly braces load first?

    下一篇: Replace character UNLESS surrounded by specific tag