《Thinking in java》中说,可以用静态方法打印出静态变量证明它们在使用之前完成初始化动作(英文版190/中文版97的练习14)。 个人以为,此方法不可行,因为,访问即触发初始化动作,而用NetBeans调试下即可证明。
代码如下:
由House.print()的输出结果就可以看出,访问即触发初始化:
步入House h1 = new House(),会发现,仅有静态变量 i 被初始化,间接证明了:
1.静态变量初始化只有在必要时刻才会进行(因为变量 k 没被初始化)
2.静态变量会在被使用之前完成初始化(此时,i 的值为0,而不是5)
继续执行,结果如下(中间有省略):
可知:
1.静态对象的初始化,仅仅有声明就可完成(House h1)
2.非静态变量也会自动初始化,比如,此时,w1,w2,w3就被初始化为null
3.非静态变量的自动初始化是在静态变量的自动初始化后完成
继续执行,结果如下(中间有省略):
可知:
1.静态变量初始化只有在必要时刻才会进行(因为变量 k 只到此时才被初始化)
2.自动初始化将在构造器被调用之前发生(因为w2,w3已被初始化,而w4却未被初始化)
最后,w4被初始化,再次证明,构造器调用在自动初始化之后:
程序执行结果:
至此,测试结束...