为什么Java允许构造函数调用抽象和非最终方法?

时间:2016-08-10 17:43:32

标签: java

Java允许非final类的构造函数调用任何实例方法,即使这些方法是抽象的或非最终的。

这被认为是一种不好的做法(参见,例如,Effective Java 2nd Edition,Item 17),并且由于定义的构造函数顺序,在C ++中是不可能的。

我的问题是为什么允许在Java语言的设计中开始这一点?似乎它可能被禁止作为语言限制。是否有必要这样做?

1 个答案:

答案 0 :(得分:1)

Java语言允许它,因为没有明确的,没有争议的理由禁止它,特别是如果你认为今天的Java最佳实践在最初设计语言时并不一定是已知的。 / p>

请注意,调用抽象或非final方法的构造函数确实有效,因为子类可以覆盖所述方法,并且因为构造函数可能正在新创建的子类实例上执行(由于子类的构造函数执行顺序)超级)。

据我所知,没有必要这样做。但肯定有一些第三方图书馆会这样做,即使它被认为是一种不好的做法。