代码
第一步,程序先调用静态的变量属性(45行代码),得到table对象,然后执行Table类中的两个静态变量 bow1和bow2,调用Bow类中的构造方法,输出Bowl(1)和Bowl(2),接着执行类中构造方法,输出Table()和f1(1),(注意,这里并没有调用Table类中的f2方法)。
第二步,执行46行代码static Cupboard cupboard = new Cupboard(); 同第一步一样,输出Bowl(4),Bowl(5),这里初始化并调用了Bowl构造方法(Bowl bowl3 = new Bowl(3)),记住初始化顺序:变量-->构造-->普通方法(请看上一篇文章)。然后执行Cupboard类的构造方法,输出Cupboard()和f1(2)。
第三步,执行静态方法(38行),先打印“Creating new Cupboard”,再调用Cupboard类对象,依次输出Bowl(3),Cupboard(),f1(2),然后执行一遍第三步。
最后,再调用table.f2(1),Table类中f2方法,输出f2(1)。输出结果如下图。
据此,可判断出java类初始化的顺序为:静态属性(静态变量)>静态方法(包括静态方法块,也就是static{......})> 普通属性 >普通方法块({.....},以后补充)> 构造函数 > 普通方法。
也可看出静态的方法和静态变量被调用时只执行一次。