可能是因为扩展它并覆盖它的一些方法可能会破坏它。并且使覆盖方法更容易将暴露许多内部工作,因此如果将来他们决定更改这些(出于性能或其他原因),他们将更难在不破坏所有类的情况下更改类扩展它。
例如,考虑类中的以下方法:
public boolean nextBoolean() {
clearCaches();
return Boolean.parseBoolean(next(boolPattern()));
}
Run Code Online (Sandbox Code Playgroud)
假设你想覆盖它,因为你想让 'awesome' 评估为 'true' 布尔值(无论出于何种原因)。如果覆盖它,则不能调用 super.nextBoolean(),因为这将使用默认逻辑消耗下一个标记。但是,如果您不调用 super.nextBoolean(),则不会调用 clearCaches(),这可能会破坏其他未覆盖的方法。你不能调用 clearCaches() 因为它是私有的。如果他们让它受到保护,但随后意识到它会导致性能问题,并且想要一个不再清除缓存的新实现,那么他们可能会破坏您的覆盖实现,该实现仍然会调用它。
所以基本上是这样他们可以轻松地更改类中隐藏的部分,这些部分非常复杂,并保护您免于创建损坏的子类(或容易损坏的类)。