代码:
public class init { public init() {
System.out.println("n-arg const"); }
public init(int a) {
System.out.println("1-arg const");
}
static{System.out.println("1st static");}
static{System.out.println("2st static");}
{System.out.println("1st instance");}
{System.out.println("2st instance");} public static void main(String[] args) {
// TODO Auto-generated method stub
new init();
System.out.println("----------");
new init(5);
}}
结果:
1st static
2st static
1st instance
2st instance
n-arg const
----------
1st instance
2st instance
1-arg const
不明白之处:题中说明判断块输出的顺序方法 3.每创建一个实例后,都会初始实例化块。4.实例初始化块会在构造函数super()调用之后运行
既然如此,请解释加粗字体顺序,
个人认为:应该是
n-arg const
1st instance
2st instance
----------
1-arg const
1st instance
2st instance

解决方案 »

  1.   

    类被classloader载入时类的static块就执行了。
      

  2.   

    实例化任何对象之前都会先加载类,所以类的静态块和静态属性赋值一定是在构造方法调用之前就执行的而实例块和实例属性赋值也是在构造方法之前的,楼主可以想一下,JVM是要给每个属性赋默认值的,这个过程只能发生在构造方法之前,否则将会覆盖构造方法已经初始化好的值,既然实例属性赋值是发生在构造方法之前,为什么实例块的执行会发生在构造方法之后呢?楼主可以看一下我在8楼的例子:
    http://topic.csdn.net/u/20100702/20/3e9fb349-fba4-4f76-87c4-a39ebaeabd65.html
      

  3.   

    实例初始化块可以看成是本类中所有构造方法的公共部分,会在任何一个构造方法的前面运行,而不是后面。4.实例初始化块会在构造函数super()调用之后运行,构造函数是this(), 不是super()。