thinking in java中的代码,我把name字符串改为了static类型,
public final class Month{
private static String name;
private Month(String nm){
name=nm;
}
public String toString(){
return name;
}
public static final Month
JAN=new Month("January"),
FEB=new Month("February"),
MAR=new Month("March"),
APR=new Month("April"),
MAY=new Month("May"),
JUN=new Month("June"),
JUL=new Month("July"),
AUG=new Month("August"),
SEP=new Month("September"),
OCT=new Month("Octber"),
NOV=new Month("November"),
DEC=new Month("December");
public static final Month[] month={
JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
};
public static final Month number(int ord){
return month[ord-1];
}
public static void main(String[] args){
Month m=Month.JAN;
System.out.println(m);
Month n=Month.number(12);
System.out.println(n);
System.out.println(Month.JAN);
}
}
输出是
December
December
December
为什么最后一个还是输出“December”,调用构造器不是应该更改name 的值吗?
请解惑。。
你这最后一次调用不就是 DEC=new Month("December");吗,所以静态变量的值最后被更改为了“December”;
所有的name都变成了December,不管是哪个最后都是
public String toString(){
return name;
}
所以都是一样的。
这个涉及到了初始化顺序,在这个类中 静态变量最先被初始化,后面是其他方法,
public static final Month
JAN=new Month("January"),
FEB=new Month("February"),
MAR=new Month("March"),
APR=new Month("April"),
MAY=new Month("May"),
JUN=new Month("June"),
JUL=new Month("July"),
AUG=new Month("August"),
SEP=new Month("September"),
OCT=new Month("Octber"),
NOV=new Month("November"),
DEC=new Month("December");
这段初始化后name就为December了,无论你调用
Month m=Month.JAN;
or
Month n=Month.number(12);
都被没有执行构造器方法重新赋值,所以这些对象最后都会输出December,
你可以尝试调用
Month g = new Month("January");
一个new,这时构造器运行重新赋值