可能是因为扩展它并覆盖其中的一些方法可能会破坏它。而使其更容易重写方法将暴露太多内部工作原理,因此如果他们决定在将来更改这些内容(出于性能或其他原因),那么更改类将更加困难,而不会破坏所有扩展它的类。
例如,考虑以下方法:
public boolean nextBoolean() {
clearCaches();
return Boolean.parseBoolean(next(boolPattern()));
}
所以基本上这是为了让他们可以轻松更改类内部的隐藏部分,这些部分相当复杂,并保护您免受制作错误的子类(或易于破坏的类)的影响。
我想这是出于安全原因。这个类读取用户输入,所以有恶意的人可以扩展它,修改它的行为,这样你就会受到影响。如果它是final的,对于坏人来说就不那么容易了,因为如果他制作自己的Scanner类型(而不是java.util.Scanner),多态的原则就会被破坏。坏人可以聪明到编写一个机器人/脚本,在远程服务器上自动执行此操作...... 他甚至可以通过已编译应用程序中的动态类加载来实现。
我认为你提供的链接已经解释了一切。
在你的情况下,似乎你应该更喜欢组合而不是继承。你正在创建一个具有一些预定义行为的实用程序,并且可以隐藏Scanner类的某些(或全部)细节。
我见过很多使用继承来改变行为的实现。最终结果通常是一个庞大的设计,在某些情况下,会破坏契约和/或破坏行为。