因为超类的构造函数会在子类的构造函数之前先运行,这里超类的构造函数对someMethod()有依赖,同时someMethod()被重写,所以超类的构造函数里调用到的将是Son.someMethod(),而这时候子类还没被初始化,于是在运行到date.getTime()时便抛出了空指针异常。
因此,如果在超类的构造函数里对可覆盖的方法有依赖,那么在继承时就可能会出错。
结论
慎重使用继承,复合优先于继承。
使用继承时重写超类中存在自用性的可覆盖方法可能会出错,即使不进行重写,超类更新时也可能会引入错误。
如果使用继承和复合皆可,那么优先使用复合,上述关于继承的缺点都可以用复合来避免。
如果要使用继承,那么应该精心设计超类,并提供详细文档。