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 中声明的顺序内联到超级调用构造函数中。
我认为自己在编程方面有点 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 中声明的顺序内联到超级调用构造函数中。