与构造函数相比,类顶部的变量何时初始化?
对不起,这就是我的意思:
public class aClass {
private int num;
public aClass {...}
就发出的字节码而言,从技术上讲,默认值(null
用于对象字段等)从未显式分配。0
(这是在对象实例化期间“内部”完成的,在任何初始化程序/构造函数代码运行之前。)
实例字段的显式初始化代码在每个构造函数的开头“复制”,在编译器对类中的超类构造函数调用(如果有的话)之后。代码示例:
class Foo {
int bar = 123;
public Foo() {
// ...
}
public Foo(int bar) {
this.bar = bar;
// ...
}
}
被编译成字节码等价于:
class Foo {
int bar;
public Foo() {
this.bar = 123;
// ...
}
public Foo(int bar) {
this.bar = 123;
this.bar = bar;
// ...
}
}
初始化程序块也是如此。这意味着这些变量在任何正常的构造函数代码执行之前被初始化。
用值定义的成员在构造函数中初始化,就像任何其他成员一样。但这不完全是您编写的构造函数;Java 通过在其开头插入成员初始化程序和初始化程序块来更改幕后的每个构造函数。如果您想暂时查看它,您可以将其视为在构造函数之前初始化的成员。
实际上,您可以在调用构造函数之前将它们视为已初始化。因此,如果您有:
class Dog {
private String voice = "woof";
public Dog() {
System.out.println(voice);
}
}
您将成功地将“woof”打印到控制台,而不是null
.