一道基本的java题,请基础牢固者进。程序如下:

import java.util.Calendar;
public class Elvis {
//public static Elvis INSTANCE = new Elvis();
private final int beltSize;
private static final int CURRENT_YEAR = Calendar.getInstance().get(
Calendar.YEAR);
private Elvis() {
beltSize = CURRENT_YEAR - 1930;
}
public int beltSize() {
return beltSize;
}
public static void main(String[] args) {
System.out.println("Elvis wears a size " + new Elvis().beltSize()
+ " belt.");
}
}

输出结果为:
Elvis wears a size 83 belt.


public class Elvis {
public static Elvis INSTANCE = new Elvis();
private final int beltSize;
private static final int CURRENT_YEAR = Calendar.getInstance().get(
Calendar.YEAR);
private Elvis() {
beltSize = CURRENT_YEAR - 1930;
}
public int beltSize() {
return beltSize;
}
public static void main(String[] args) {
System.out.println("Elvis wears a size " + INSTANCE.beltSize()
+ " belt.");
}
}

输出结果为:
Elvis wears a size -1930 belt.

求深入剖析,谢谢各位了先。

第一段代码,没什么说的,常量在构造方法赋值的基本用法。

因为:INSTANCE是静态变量,不属于任何类,所以可以直接使用"INSTANCE.beltSize()"

将要执行它INSTANCE.beltSize()时,静态属性INSTANCE开始初始化,执行第六行的语句“new Elvis2()”

执行构造方法Elvis2(),执行Elvis2()时,CURRENT_YEAR的值还为0,所以结果是-1930。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-23
实例化执行顺序的问题

当程序运行时 初始化class Elvis 在内存里给成员变量申请空间
然后开始赋值成员变量
当执行到 public static Elvis INSTANCE = new Elvis(); 开始实例化第二个Elvis实例
在实例化第二个Elvis时private static final int CURRENT_YEAR是在内存中已经存在的,但是没有赋值,一般类型的变量未赋值是null可是整数的话为赋值也是能取到值的,值是0,由于静态变量在内存中是一个,而且已经有第一个Elvis申请过空间了,就不会再去执行赋值Calendar.getInstance().get(Calendar.YEAR);这句就没有执行,而是直接引用了第一个Elvis申请到内存空间的默认值0。然后执行构造方法,计算CURRENT_YEAR - 1930; 结果是0-1930 public static Elvis INSTANCE = new Elvis();这个实例化结束继续执行 到第一个Elvis实例的
private static final int CURRENT_YEAR = Calendar.getInstance().get(Calendar.YEAR);这句才开始给CURRENT_YEAR赋值2013 从这句起所有的CURRENT_YEAR才都是2013追问

感谢你的细心回答,但你可以把他看成是两个程序,没有关联,我看着有点点乱,能一个一个的解释下吗?~3q了!

本回答被网友采纳
第2个回答  2013-01-28
很简单嘛,变量定义的先后顺序问题。
后面的Elvis类:
先“public static Elvis INSTANCE = new Elvis();”
后“private static final int CURRENT_YEAR = Calendar.getInstance().get(
Calendar.YEAR);”
定义变量顺序,如果先定义CURRENT_YEAR 变量,后定义INSTANCE变量,就和前面的Elvis类输出是相同的了。
第3个回答  2013-01-22
这个我想知道为什么,为什么第二个中
private static final int CURRENT_YEAR = Calendar.getInstance().get(
Calendar.YEAR);
为0
相似回答