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

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

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


当前回答

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

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

其他回答

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

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

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

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

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

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

最好的例子是

公共最终类

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

在一个场景中,final很重要,当您出于安全原因想要防止类的继承时。这允许您确保您正在运行的代码不会被其他人覆盖。

另一个场景是为了优化:我似乎记得Java编译器内联了final类中的一些函数调用。因此,如果你调用a.x()并且a被声明为final,我们在编译时就知道代码将是什么,并且可以内联到调用函数中。我不知道这是否真的做到了,但最终是有可能的。