以下是有关Thinking In JAVA的一段代码。
其中红色部分不知为何?为何调用另一个有参数的构造方法时又打印出a=10?不是已经在非静态的块中赋值为8了吗?
请看代码及测试结果分析:
public class TestStaticCon {
static int a=0;
static {
a=10;
System.out.println("静态程序块中A="+a);
}
{
a=8;
System.out.println("非静态程序块中A="+a);
}
 public TestStaticCon(){
 this("a 带参构造方法中的值: " + a);  
 // 调用另外一 个构造方法   
 System.out .println( a); 
 System. out .println(" 无参构造方法在执行  a=" + a); 
 }
 
 
 public TestStaticCon(String str) {  
 System. out .println(str);       
 System.out .println(a);
}
 public  static void main(String args[]){
 System.out.println("开始测试");
 TestStaticCon test = null ;
 System.out.println("声明结束");
 test =new TestStaticCon();

 }}
测试结果:
静态程序块中A=10
开始测试
声明结束
非静态程序块中A=8
a 带参构造方法中的值: 10
8
8
无参构造方法在执行  a=8代码分析

解决方案 »

  1.   

    http://tieba.baidu.com/p/1555624175
    这里看到的答案做个搬运工吧,还有很多东西要学啊
    ======================【非原创】======================================
    实际的执行过程是这样的..
    首先,static { ... },这时候a的值是10
    其次,默认构造器TestStaticCon(),首先为this(String)准备参数,参数就是"..." + a,这时候a的值是10,注意默认构造器尚未执行完
    再次,调用有参构造器,在有参构造器中首先之行的是初始化,也就是{ a = 8 }这部分,尽管这与大多数家伙的认识不符,但事实就是这样
    最后,完成默认构造器调用..因为我是看的javap -verbose,所以有作弊之嫌!
    =============================================================