在继承中,构造器决不能调用可被覆盖的方法,无论是直接调用还是间接调用。如果违反了这条规则,很可能导致程序失败。下面来看一个例子:
import |
输出结果是:
调用子类方法
调用子类方法
因为超类中的构造器调用overrideMe方法是会调用子类中的覆盖版本,这是多态的特性。稍微改动一下代码:
import |
这时会抛出NullPointerException,因为子类中的overrideMe覆盖版本将会在子类实例化完成之前就被父类构造器调用,而此时list尚未被实例化,因此抛出异常。
总结:构造器绝不能调用可以被覆盖的方法。构造器中唯一能安全调用的是基类中的private和final方法,因为他们不会被覆盖。