java 什么时候执行 class 级字段分配?

When does java execute class-level field assignments?

我认为自己在编程方面有点 beginner/intermediate;大多数时候,我似乎知道如何编写代码,但我不确切知道 java 用它做什么。有时我有一个在构造函数中分配的字段:

public class MyClass {
     public int x;
     
     MyClass() {
       x = 5;
     }
}

...据我所知,当创建 MyClass 的新对象时,x 会设置为 5。但是,有时我会在任何构造函数或函数之外分配字段:

public class MyClass {
     public int x = 5;
     public static MyOtherClass y = new MyOtherClass();
 
     public MyClass() {

     }
}

java 运行 这些作业具体是什么时候?它们是在创建 MyClass 的对象时还是在此之前完成的?如果我引用静态变量,例如“y”:

public class MyThirdClass {
     public MyOtherClass z = MyClass.y;
}

是在我第一次引用它时分配了“y”,还是Java在那之前已经完成了?在这种情况下,“y”不能在创建 MyClass 的新对象后赋值,因为我还没有为它创建任何对象。那么所有这些构造函数和方法之外的字段赋值是在程序 运行 时一次性完成,还是在它们第一次 referenced/needed 时赋值?还是其他时间?感谢您提供这方面的任何信息。

像这样的成员变量初始值设定项:

public class MyClass {
     public int x = 5;
     public int y;
     
     MyClass() {
       y = 6;
     }
}

内联到调用超级构造函数(隐式或显式)的所有构造函数中,在调用超级构造函数和构造函数主体的其余部分之间:

public class MyClass {
     public int x;
     
     MyClass() {
       super();
       x = 5;
       y = 6;
     }
}

不仅仅是成员变量初始值设定项:成员变量初始值设定项基本上类似于成员声明,​​后面跟着一个实例初始值设定项:

public int x = 5;

// is the same as

public int x;

{
  x = 5;
}

class 中的所有实例初始化器都按照它们在 class 中声明的顺序内联到超级调用构造函数中。