与构造函数相比,类顶部的变量何时初始化?
对不起,这就是我的意思:
public class aClass {
private int num;
public aClass {...}
答案 0 :(得分:5)
就发出的字节码而言,默认值(对象字段的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;
// ...
}
}
初始化程序块也是如此。这意味着在任何正常的构造函数代码执行之前,这些变量都会被初始化。
答案 1 :(得分:4)
使用值定义的成员在构造函数中初始化,就像任何其他成员一样。但它并不完全是你写的构造函数; Java通过在其开头插入成员初始值设定项和初始化程序块来更改幕后的每个构造函数。如果要在构造函数之前初始化成员,可以将其视为临时查看它。
答案 2 :(得分:4)
实际上,您可以在调用构造函数之前初始化它们。所以如果你有:
class Dog {
private String voice = "woof";
public Dog() {
System.out.println(voice);
}
}
您将成功地将“woof”打印到控制台,而不是null
。