声明,不记得这题是从哪里弄来的,如果原作者发现请见谅问,输出结果是什么(当然要在IDE里运行前说出结果)
import java.util.Calendar;
public class Test{
public static final Test INSTANCE = new Test();
private int size = 6;
private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR);
private Test(){
size = THIS_YEAR - 1930;
}
public int getSize(){
return size;
}

public static void main(String[] args){
System.out.println(INSTANCE.getSize());
}
}因为我想的结果与答案不一致,也在群里问了很多朋友,但答案太多了,现在也没有弄明白,期待回复,谢谢

解决方案 »

  1.   

    把程序改成下面这个,你就明白了。import java.util.Calendar;public class Test {
        public static Test INSTANCE = new Test();
        private int size = 6;
        private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR);    private Test() {
            System.out.println("new Test()");
            System.out.println("THIS_YEAR:"+THIS_YEAR);
            size = THIS_YEAR - 1930;
        }    public int getSize() {
            System.out.println("getSize()");
            return size;
        }    public static void main(String[] args) {
            System.out.println(INSTANCE.getSize());
        }
        
        static {
            //INSTANCE = new Test();
            THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR);
            System.out.println("static:"+THIS_YEAR);
        }
    }输出:
    new Test()
    THIS_YEAR:0
    static:2008
    getSize()
    -1930也就是说,先构造函数(new Test()),再THIS_YEAR赋值(static:2008)。然后你把上面//INSTANCE = new Test();的注释去掉试试?
    输出:
    new Test()
    THIS_YEAR:0
    new Test()
    THIS_YEAR:2008
    static:2008
    getSize()
    78OK,得到78这个结果了吧?
    搞这个没有太大意思,不要钻牛角了。
      

  2.   

    取得值时THIS_YEAR还没来得及初始化 
      

  3.   

    -1930
    在进行new Test()操作的时候,THIS_YEAR还没赋值,把这句话放在public static final Test INSTANCE = new Test(); 之前就好了。
      

  4.   

    package com.sample.action; import java.util.Calendar;  
    public class Test{  
    public static final Test INSTANCE = new Test();  
    private static int size = 6;  
    private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR); 
    static{ 
    size = THIS_YEAR - 1930;  

    private  Test(){ 

    public int getSize(){  
    return size;  
    }  
    public static void main(String[] args){  
    System.out.println(INSTANCE.getSize());  
    }  
    }  
      

  5.   

    执行顺序如下 
    1 INSTANCE 静态块的初始化,由于其赋值,所以调用new Test()方法 
    2 test 按照顺序初始化类级变量,注意,此时静态变量由前面一步做,所以不会初始化其它的变量,此时size = 6; 
    3 然后调用构造器 size=0-1930 = -1930, 因为没有初始化的静态变量,默认值为0 
    4 返回 
    5 继续调用THIS_YEAR的初始化 
    6 完成初始化,调用getSize(), 返回了-1930 
      

  6.   

    import java.util.Calendar; 
    public class Test{ 
      public static final Test INSTANCE = new Test(); //(2)
      private int size = 6;  //(1)
      private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR); //(4)
      private Test(){  
        size = THIS_YEAR - 1930;  //(3)
      } 
      public int getSize(){ 
        return size; 
      }   public static void main(String[] args){ 
        //System.out.println("THIS_YEAR="+THIS_YEAR);
        System.out.println(INSTANCE.getSize()); // (5)  } 
    } java 类中的成员变量初始化顺序是这样的:
    1. 所有普通类型变量
    2. 所有静态类型变量
    上面程序中所作的标记,如(1),(2),标明了编译器执行的步骤。
    (1)首先初始化size,值为6
    (2)初始化INSTANCE,由于INSTANCE创建了一个Test对象,此时将调用Test构造函数
    (3)构造函数中执行size = THIS_YEAR - 1930,由于此时THIS_YEAR还没有被初始化,其值为0(基本类型int的默认值),所以此时size=-1930.
    (4)初始化THIS_YEAR ,THIS_YEAR = 2008.
    (5)初始化完毕,执行main函数,INSTANCE.getSize()=-1930.注意:此时堆中已经有了INSTANCE和THIS_YEAR,INSTANCE指向一个Test对象(Test.INSTANCE指向自己,Test.THIS_YEAR=2008,Test.size=-1930),THIS_YEAR=2008.这就是整个过程,关于类的初始化顺序问题,《Thinking in java》第四章有很详细的描述 :)
      

  7.   

    回5楼
    有一点不明白,一点需确认
    执行顺序如下 不明白的地方 
    1 INSTANCE 静态块的初始化,由于其赋值,所以调用new Test()方法  
    private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR); //那么它也是静态的啊,为什么它没有被初始化呢,还是因为它"应该"被初始化,但由于new了,所以它要在new其后执行吗?需确认的地方
    6 完成初始化,调用getSize(), 返回了-1930
    即使调用了getSize()方法,那么也要等待所有的初始化完毕才会被执行吗?,如果执行过程中size值再被改变,那么它的值是后来被改变的还是调用getSize()这个方法的呢?
    谢谢
      

  8.   

    补充一点,在看THINK IN JAVA的时候,上面不是说先初始化static,然后才是非static的吗?如果是这样的话
    那么第二个static也应该被初始化呀
      

  9.   

    二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test(); 
    还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
      

  10.   

    二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test(); 
    还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
      

  11.   

    二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test(); 
    还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
      

  12.   

    二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test(); 
    还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
      

  13.   

    二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test(); 
    还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
      

  14.   

    二楼的二次输出把我搞晕了,不知道是先执行static块里的还是先执行public static final Test INSTANCE = new Test(); 
    还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
      

  15.   

    二楼的代码看起来还是不太明白
    不知道是static的还是非static的先被初始化呢