在Java中,main方法之后的那些语句的初始化顺序是什么

Nat*_*anC 8 java initialization

我了解到初始化顺序的原则是:

  1. 超类首先(在这种情况下不在这里讨论)
  2. 静态变量声明和静态初始化块按出现顺序排列
  3. 实例变量声明和静态初始化块按出现顺序排列
  4. 构造函数

但我仍然对此代码的输出感到困惑:

public class Test1 {

    static {
        add(2);
    }

    static void add (int num) {
        System.out.println(num + " ");
    }

    public Test1() {
        add(5);
        System.out.println("Constructor!");
    }

    static {
        add(4);
    }

    {
        add(6);
    }

    static {
        new Test1();
    }

    {
        add(8);
    }

    public static void main(String[] args) {
        System.out.println("Main method!");
        add(10);
    }

    {
        add(11);
    }
    static {
        add(12);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

2 
4 
6 
8 
11 
5 
Constructor!
12
Main method!
10 
Run Code Online (Sandbox Code Playgroud)

如果没有add(10)的陈述; 加(11); 加(12); 我完全可以理解.你能解释一下这三个陈述的初始化顺序吗?

Don*_*nic 7

静态初始化程序是第一个,所以你得到

2 
4
Run Code Online (Sandbox Code Playgroud)

但是在下一个静态初始化程序中,您调用Test1.class的新实例,因此触发实例初始化程序,在它们之后触发构造函数,然后得到:

6 
8 
11 
5 
Constructor!
Run Code Online (Sandbox Code Playgroud)

之后调用其余的静态初始化程序.所以:

12
Run Code Online (Sandbox Code Playgroud)

最后一个是主要方法:

Main method!
10 
Run Code Online (Sandbox Code Playgroud)


小智 7

1)没有如下名称的块称为" 实例初始化器 ",只有在创建新对象时才会调用它,如DefaultConstructor或noArg构造函数.

{
    add(11);
}
Run Code Online (Sandbox Code Playgroud)

2)在上面的代码中,你有静态块(在类加载本身首先被调用),实例初始化器(在创建对象时调用),显式DefaultConstructor(在创建对象时调用,但记住始终优先实例初始化器))和最后的主要方法.

3)现在让我们分析你的代码,

第一个电话:

static 
{
   add(2); //print 2
}
Run Code Online (Sandbox Code Playgroud)

第二个电话:

static {
        add(4); // print 4
}
Run Code Online (Sandbox Code Playgroud)

第3个电话:

static {
    new Test1(); 
    // Here Object is getting created so all Instance Initialzer will be called first in a sequential manner.
}
Run Code Online (Sandbox Code Playgroud)

第四个电话:

{
    add(6); // print 6
}
Run Code Online (Sandbox Code Playgroud)

第5个电话:

{
    add(8);  // print 8
}
Run Code Online (Sandbox Code Playgroud)

第6次电话:

{
    add(11);   // print 11
}
Run Code Online (Sandbox Code Playgroud)

第7次调用:在Instance Initializer之后,将调用Explicit Default Constructor.

public Test1() {
    add(5);    // print 5
    System.out.println("Constructor!");   // print Constructor!
}
Run Code Online (Sandbox Code Playgroud)

第8次调用:再次调用最后一个静态块.

static {
    add(12);   // print 12
}
Run Code Online (Sandbox Code Playgroud)

第9次调用:最后将调用main方法

public static void main(String[] args) {
    System.out.println("Main method!");  // print Main method!
    add(10); // print 10
}
Run Code Online (Sandbox Code Playgroud)