static在构造器中的使用

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,这时构造器运行重新赋值