//代码如下,摘自java编程思想:
class Bowl {
Bowl(int maker) {
System.out.println("Bowl(" + maker + ")");
}
void f1(int maker) {
System.out.println("f1(" + maker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int maker) {
System.out.println("f2(" + maker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int maker) {
System.out.println("f3(" + maker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String[] args) {
System.out.println("Creating new Cupboard() in main");
new Cupboard();
System.out.println("Creating new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
output:
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)
初学者或基础不牢的同学(比如我自己= =\)可能看见这个程序会有点晕,为什么输出的结果是这么个顺序?
要了解静态存储区域是何时初始化的。人人都知道一个程序是从main()方法开始的,但是如果直接着手main方法开始进入程序,那么得出的output就不是正确的了。这里涉及到类加载的问题。
首先得知道初始化的顺序:1.先静态对象 2.非静态对象 。
在Table类和Cupboard类里面加入了Bowl类型的静态成员变量,而且只有在第一个Table对象被创建的时候,它们才会被初始化,并且只能被初始化一次。
从output观察:要想执行main方法,必须要加载StaticInitialization类,然后静态域table 、cupboard被初始化,即它们对应的类被加载,并且Table类和Cupboard类里包含静态的Bowl对象,所以Bowl类也被加载,即在main()方法开始之前这几个类都被加载了。所以,输出结果的顺序就明白了吧。
需要注意的地方就三点:1.先静态对象,后非静态对象;
2.静态对象只能被初始化一次(output里面的Bowl(1)、2、4、5只出现一次,而Bowl(3)出现了两次,因为new了两个Cupboard()对象);
3.所有的事物通过static联系到了一起...
以上总结是个人理解及书上的解释,若有错误请指正、各位大神多多包涵!本人Java小白,愿与大家多交流学习。