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

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

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


当前回答

首先,我推荐这篇文章:Java:何时创建最终类


如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。

final类只是一个不能扩展的类。

(这并不意味着对该类对象的所有引用都将被声明为final。)

何时将一个类声明为final是有用的,这在这个问题的答案中涵盖:

在Java中禁止继承的好理由?

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

在某种意义上是的。

通过将一个类标记为final,您将禁用该语言的这部分代码的强大而灵活的特性。然而,有些类不应该(在某些情况下也不能)在设计时很好地考虑到子类化。在这些情况下,将类标记为final是有意义的,尽管它限制了OOP。(记住,final类仍然可以扩展另一个非final类。)

其他回答

如上所述,如果你想让任何人都不能改变方法的功能,那么你可以将它声明为final。

示例:用于下载/上传的应用服务器文件路径,基于偏移量拆分字符串,这样的方法你可以将其声明为Final,这样这些方法函数就不会被改变。如果你想要这样的final方法在一个单独的类中,那么将这个类定义为final类。所以Final类将拥有所有Final方法,而Final方法可以在非Final类中声明和定义。

最好的例子是

公共最终类

这是一个不可变的类,不能扩展。 当然,不仅仅是使类final为不可变。

将一个类保留为最终类的一个好处是:-

String类保持为final,这样任何人都不能重写其方法并更改功能。例如,没有人可以改变length()方法的功能。它总是返回一个字符串的长度。

这个类的开发人员不希望任何人改变这个类的功能,所以他把它作为最终的。

我只知道一个实际用例:生成类

在生成类的用例中,我知道一个:依赖注入,例如https://github.com/google/dagger

把FINAL看作是“线的尽头”——那个家伙再也不能生育后代了。所以当你这样看的时候,有很多现实世界的场景,你会遇到,需要你标记一个'结束行'标记类。这是领域驱动设计——如果你的领域要求一个给定的实体(类)不能创建子类,那么把它标记为FINAL。

我应该指出,没有什么可以阻止您继承一个“应该标记为final”的类。但这通常被归类为“滥用继承”,这样做是因为大多数情况下你想从你的类的基类继承一些函数。

最好的方法是查看领域,并让它决定您的设计决策。