了解几个关键的地方就行了:
从全局变量的初始化开始
static Table t2 = new Table();
//Table()中也是内部变量的初始化先开始,然后是构造方法
static Cupboard t3 = new Cupboard();
然后才是main方法内的。
从全局变量的初始化开始
static Table t2 = new Table();
//Table()中也是内部变量的初始化先开始,然后是构造方法
static Cupboard t3 = new Cupboard();
然后才是main方法内的。
Bowl(int er) { ---------------------3,5构造
System.out.println("Bowl(" + er + ")");
}
void f(int er) { ----------------------7,被table调用
System.out.println("f(" + er + ")");
}
}class Table {
static Bowl b1 = new Bowl(1); -----------------2,构造之前,也先static变量
Table() { -----------------6,变量已全部构造完成,执行构造函数
System.out.println("Table()");
b2.f(1); -----------------调用bow的f()
}
void f2(int er) {
System.out.println("f2(" + er + ")");
}
static Bowl b2 = new Bowl(2); ------------------4,第二个static变量的构造
}class Cupboard {
Bowl b3 = new Bowl(3); -------------------11,static构造完后,构造非static成员
static Bowl b4 = new Bowl(4); -----------------9,先static成员构造
Cupboard() { ----------------12,成员已经构造好,执行构造函数
System.out.println("Cupboard()");
b4.f(2); --------------13,调用bow的f()
}
void f3(int er) {
System.out.println("f3(" + er + ")");
}
static Bowl b5 = new Bowl(5); ----------------10,按次序构造static成员
}public class StaticInitialization {
public static void main(String[] args) {
System.out.println(
"Creating new Cupboard() in main"); -----------14,成员已经构造好,执行main函数体,首先执行此句
new Cupboard(); ------------------15,构造临时Cupboard对象
System.out.println(
"Creating new Cupboard() in main");
new Cupboard();
t2.f2(1);
t3.f3(1);
}
static Table t2 = new Table(); -------------------1,先static变量
static Cupboard t3 = new Cupboard();-----------------8,继续构造static成员
}只写到15,后面应该自己会写了,都是重复劳动。前面已经能够说明问题了。记住:
构造类前先构造父类(如果父类还有父类,则先构造这个父类的父类,类推)
构造类的时候,先构造static变量(按代码顺序),构造完成后,构造非static变量
变量全部构造好以后,进入构造函数。
Table初始化呢又先执行Staic Bowl b1=new Bowl(1);
然后bowl初始化执行System.out.println("Bowl("+er+")")这一句了,这时er为1。了所以先打印bowl(1)。
2).Table里面的第二句为static Bowl b2=new Bowl(2)。因此打印Bowl(2)。
3).table里面的属性初始完后是table初始化打印table()。
4).调用b2.f1().打印出f(1)了。
5).Cupboad里面的b3初始化完后,转向下一个属性变量static Bowl b4= new Bowl(4).就是打 印Bowl(4)了。
6)因此类推.......
老兄我也就不一一叙述了。总之要记住在类中先初始化属性变量,然后才是构造函数。这个问题也很有意思。