下面这个类就违反了此条规则,例子如下:
public class Super {
public Super() {
// 构造器中调用被覆盖的方法
overrideMe();
}
public void overrideMe() {
}
static final class Sub extends Super {
private final Date date;
public Sub() {
date = new Date();
}
@Override
public void overrideMe() {
System.out.println(date);
}
}
public static void main(String[] args) {
Sub sub = new Sub();
sub.overrideMe();
}
}
输出结果:
null
Sun Mar 24 18:35:26 CST 2013
你可能会期待这个程序会打印出两次日期,但是它第一次打印为null,因为overrideMe 方法被Super构造器调用的时候,子类Sub构造器还没机会初始化date变量。注意:
这个程序观察到的final域处于两种不同的状态。