在初始化顺序上,JAVA编程思想4上里面,变量定义在方法内不管写在何位置都会先与任何方法执行
class Bowl {
Bowl(int marker) {
print("Bowl(" + marker + ")");
}
void f1(int marker) {
print("f1(" + marker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
print("Table()");
bowl2.f1(1);
}
void f2(int marker) {
print("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
print("Cupboard()");
bowl4.f1(2);
}
void f3(int marker) {
print("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String[] args) {
print("Creating new Cupboard() in main");
new Cupboard();
print("Creating new Cupboard() in main");
new Cupboard();
// table.f2(1); ⑴
// cupboard.f3(1);⑴
}
// static Table table = new Table();⑴
// static Cupboard cupboard = new Cupboard();⑴
}
类似代码中 输出结果:
Creating new Cupboard() in main
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
由此对于java初始化在没看书之前我是以为先构造器后变量,会认为输出结果可能是
Creating new Cupboard() in main
Bowl(4)
Bowl(5)
Cupboard()
Bowl(3)
f1(2)
Creating new Cupboard() in main
Cupboard()
Bowl(3)
f1(2)
而这样是错误的,先变量定义初始化,同级别按顺序,先静态后非静态再到构造方法。同时将⑴注释打开输出结果:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
即,静态变量当第一次被引用或创建对象时初始化,后续不再初始化。这是一个可能被大家小细节,基础东西回顾,不喜勿喷。