静态数据初始化 你 真的了解了吗?构造方法的初始之后。。我又做错了,太粗心了

静态数据初始化 你 真的了解了吗?构造方法的初始之后。。我又做错了,太粗心了

  下面的程序输出什么呢?  考虑下哦。。。。

public   class  Test  {
    
public static final Test TEST = new Test();
    
private final int belt;
    
private static final int CURRENT_YEAR = Calendar.getInstance().get(Calendar.YEAR);
    
    
public Test(){
        belt 
= CURRENT_YEAR - 1930;
    }

    
public int getBelt(){
        
return belt;
    }

    
public static void main(String []args) throws Exception{
        System.out.println(TEST.getBelt());
    }

}

可能你觉得应该是当前年- 1930, 例如:今年是2009,2009-1930= 79,运行结果真的是这样吗?
你运行下,额,奇怪,居然是 -1930,  额,为什么呢??

  原来 首先其静态域 被设置为缺省值, TEST先设置为null, belt设置为0 , 然后TEST构造器计算出来,但我们已经初始化belt了,
belt被设置为final, 所以忽略了。。。 
再来看下 下面一个简单的例子,刚开始做的时候不仔细,哎,, 我错了。。哎~!~ 希望大家不要跟我一样啊。
 1  class  Point {
 2       protected   final   int  x, y;
 3       private   final  String name;
 4 
 5      Point( int  x,  int  y) {
 6           this .x  =  x;
 7           this .y  =  y;
 8          name  =  makeName();
 9      }
10 
11       protected  String makeName() {
12           return   " [ "   +  x  +   " , "   +  y  +   " ] " ;
13      }
14      
15       public   final  String toString(){
16           return  name;
17      }
18 
19  }
20 
21  public   class  ColorPoint  extends  Point {
22       private   final  String color;
23      
24      ColorPoint( int  x,  int  y, String color){
25           super (x,y);
26           this .color  =  color;
27      }
28       protected  String makeName() {
29           return   super .makeName() + " : " + color;
30      }
31      
32       public   static   void  main(String[] args) {
33          System.out.println( new  ColorPoint( 1 , 2 , " abc " ));
34      }
35      
36  }

运行结果:  [1,2]:null
程序从main启动,然后到 25行, super(x,y);   之后 到 第 8行    name = makeName();  再之后29行,  return super.makeName()+":"+color;
这里,方法被子类重载了,运行到26行   this.color = color;  最后结束, 当然输出: [1,2]:null  

你可能感兴趣的:(静态数据初始化 你 真的了解了吗?构造方法的初始之后。。我又做错了,太粗心了)