下面的程序输出什么呢? 考虑下哦。。。。
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