此代码演示了为什么你应该 永远不会 调用一个抽象方法,或任何其他重写方法,从构造函数:
abstract class Super { Super() { doSubStuff(); } abstract void doSubStuff();}class Sub extends Super { String s = "Hello world"; void doSubStuff() { System.out.println(s); }}public static void main(String[] args) { new Sub();}运行时,将打印
null。这意味着构造函数中仅有的“安全”方法是私有和/或最终方法。
另一方面,您的代码实际上并未从构造函数中调用抽象方法。相反,您将未初始化的对象传递给另一个线程进行处理,这更糟,因为正在启动的线程可能会被赋予优先级并在
base完成初始化之前执行。



