我正在读一本关于Java的书,它说你可以将整个类声明为final。我想不出有什么地方可以用它。

我只是一个编程新手,我想知道程序员是否真的在他们的程序中使用这个。如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。

如果Java是面向对象的,并且你声明了一个final类,难道它不会阻止类具有对象的特征吗?


当前回答

相关阅读:Bob Martin的《开闭原理》。

主要引用:

软件实体(类、模块、 函数等)应该是开放的 分机,但已关闭 修改。

最后一个关键字是在Java中强制执行的方法,无论是在方法上还是在类上。

其他回答

Final类不能扩展。因此,如果你想要一个类以某种方式运行,并且不希望有人重写方法(可能效率较低,恶意代码更多),你可以将整个类声明为final或你不想被更改的特定方法。

由于声明一个类并不会阻止一个类被实例化,这并不意味着它会阻止类具有对象的特征。只是您必须坚持使用类中声明方法的方式。

如果类被标记为final,这意味着类的结构不能被任何外部的东西修改。最明显的是当你在做传统的多态继承时,基本上类B扩展A是行不通的。它基本上是一种保护代码某些部分(一定程度上)的方法。

澄清一下,标记类final并没有将其字段标记为final,因此不会保护对象属性,而是保护实际的类结构。

final类是不能扩展的类。此外,方法可以声明为final,以表明不能被子类覆盖。

如果您编写api或库,并希望避免被扩展以改变基本行为,则防止类被子类化可能特别有用。

在Java中,不能更改带有final修饰符的项!

这包括final类、final变量和final方法:

final类不能被任何其他类扩展 最终变量不能被重新赋值 final方法不能被覆盖

面向对象不是关于继承,而是关于封装。继承会破坏封装。

在很多情况下,声明类final是非常有意义的。任何代表“价值”的对象,如颜色或金额,都可能是最终的。他们是独立的。

如果您正在编写类库,请将类设为final,除非您显式地将它们缩进以派生。否则,人们可能会派生你的类并重写方法,破坏你的假设/不变量。这也可能有安全隐患。

Joshua Bloch在《Effective Java》一书中建议明确地为继承而设计,或者禁止为继承而设计,他指出为继承而设计并不是那么容易。