声明,不记得这题是从哪里弄来的,如果原作者发现请见谅问,输出结果是什么(当然要在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());
}
}因为我想的结果与答案不一致,也在群里问了很多朋友,但答案太多了,现在也没有弄明白,期待回复,谢谢
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());
}
}因为我想的结果与答案不一致,也在群里问了很多朋友,但答案太多了,现在也没有弄明白,期待回复,谢谢
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这个结果了吧?
搞这个没有太大意思,不要钻牛角了。
在进行new Test()操作的时候,THIS_YEAR还没赋值,把这句话放在public static final Test INSTANCE = new Test(); 之前就好了。
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());
}
}
1 INSTANCE 静态块的初始化,由于其赋值,所以调用new Test()方法
2 test 按照顺序初始化类级变量,注意,此时静态变量由前面一步做,所以不会初始化其它的变量,此时size = 6;
3 然后调用构造器 size=0-1930 = -1930, 因为没有初始化的静态变量,默认值为0
4 返回
5 继续调用THIS_YEAR的初始化
6 完成初始化,调用getSize(), 返回了-1930
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》第四章有很详细的描述 :)
有一点不明白,一点需确认
执行顺序如下 不明白的地方
1 INSTANCE 静态块的初始化,由于其赋值,所以调用new Test()方法
private static int THIS_YEAR = Calendar.getInstance().get(Calendar.YEAR); //那么它也是静态的啊,为什么它没有被初始化呢,还是因为它"应该"被初始化,但由于new了,所以它要在new其后执行吗?需确认的地方
6 完成初始化,调用getSize(), 返回了-1930
即使调用了getSize()方法,那么也要等待所有的初始化完毕才会被执行吗?,如果执行过程中size值再被改变,那么它的值是后来被改变的还是调用getSize()这个方法的呢?
谢谢
那么第二个static也应该被初始化呀
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
还有我觉得二楼说的搞这个没什么意思,觉得有点不太负责或是怎么形容吧如果知道这个类的执行顺序的话,比如我,那我就会觉得他的输出是2008-1930的值
不知道是static的还是非static的先被初始化呢