先看两段代码和它们的输出吧:public class TestStaticCon {  public static int a = 0;  { 
a = 10; 
System.out.println("父类的非静态代码块在执行a=" + a); 
}  public TestStaticCon() { 
this("a在父类带参构造方法中的值:" + a); // 调用另外一个构造方法 
System.out.println(a); 
System.out.println("父类无参构造方法在执行a=" + a); 
}  public TestStaticCon(String n) { 
System.out.println(n); 
}  public static void main(String[] args) { 
TestStaticCon tsc = new TestStaticCon(); 



父类的非静态代码块在执行a=10
a在父类带参构造方法中的值:0 --->已经执行了非静态块了,为什么还是0呢?
10
父类无参构造方法在执行a=10public class TestStaticCon1 { 
public static int a = 0;  static { 
a = 10;  //能改变a的值
System.out.println("父类的静态代码块在执行a=" + a); 
}  { 
a = 20;  //不能改变a的值
System.out.println("父类的非静态代码块在执行a=" + a); 
}  public TestStaticCon1() { 
this("a在父类带参构造方法中的值:" + a); // 调用另外一个构造方法 
System.out.println(a); 
System.out.println("父类无参构造方法在执行a=" + a); 
}  public TestStaticCon1(String n) { 
System.out.println(n); 
}  public static void main(String[] args) { 
TestStaticCon1 tsc = new TestStaticCon1(); 


父类的静态代码块在执行a=10
父类的非静态代码块在执行a=20
a在父类带参构造方法中的值:10 --->同样的问题,非静态块执行了  怎么还是10,而不是20呢?
20
父类无参构造方法在执行a=20

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【justinavril】截止到2008-08-02 14:02:58的历史汇总数据(不包括此帖):
    发帖的总数量:12                       发帖的总分数:580                      每贴平均分数:48                       
    回帖的总数量:140                      得分贴总数量:36                       回帖的得分率:25%                      
    结贴的总数量:11                       结贴的总分数:530                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:1                        未结的总分数:50                       
    结贴的百分比:91.67 %               结分的百分比:91.38 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    值得尊敬

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=justinavril
      

  2.   

    注意:
     this("a在父类带参构造方法中的值:" + a); // 调用另外一个构造方法 
    这里this是在构造方法中最早调用的,所以这个时候a是0,所以是把0做为参数传入另一个构造方法的。
    然后开始执行这个构造方法 public TestStaticCon1(String n) { 
            System.out.println(n); 
        }
    执行之前首先执行初始化
    static { 
            a = 10;  //能改变a的值
            System.out.println("父类的静态代码块在执行a=" + a); 
        } 
    所以这时候a已经是10了。然后执行另一个构造方法,注意构造方法的参数是:a在父类带参构造方法中的值:0
      

  3.   

    第二个问题也是一样的。
    这里也是以a为参数,当然结果是你显示的那样了this("a在父类带参构造方法中的值:" + a);
      

  4.   

    this调用其它构造方法其实是在块初始化之前执行的。
      

  5.   

    当执行构造方法时,先静态的变量和块,然后非静态的变量和块,然后下面出现this调用构造方法时,它取的值是在静态变量和块发生作用之后取到的
    这么理解对吗?另外 this是指代当前的对象  那this肯定是最先产生的  对吧?也就是说现有对象  才有它自己的变量,构造方法...对吧?