public class TestInitialization { public int i;
public int j;
TestInitialization(){
System.out.println("j="+j);
i = 30;
}
public String toString(){
return "i="+i+" j="+j;
}
{
j = 20;
}
public static void main(String[] args) {
TestInitialization test = new TestInitialization();
System.out.println(test); }}
这个类的打印结果是
j=20
i=30 j=20
大家看看,这个j是什么时候被初始化的?在调用构造函数之前就被初始化了?

解决方案 »

  1.   

    你这个和直接声明 public int j=20;是一样的
      

  2.   

    编译的时候是把那段代码放到初始化方法的最前面了,LZ可以找一个反编译工具看一下,jd-gui就行,结果如下TestInitialization()
      {
        this.j = 20;
     
        System.out.println("j=" + this.j);
        this.i = 30;
      }
      

  3.   

    如果不为j赋初始值,那么,这个变量在执行的时候是不执行的,只有给它赋值的时候才执行到,如果一开始就给j赋值,那么就会执行到j赋值的那一条语句