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

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

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


当前回答

关键字final本身意味着某些东西是最终的,不应该以任何方式修改。如果一个类被标记为final,那么它就不能被扩展或子类化。但问题是我们为什么要做期末考?在我看来,原因有很多:

标准化:一些类执行标准函数,它们是不打算被修改的,例如类执行与字符串操作或数学函数相关的各种函数等。 安全原因:有时我们编写的类执行各种身份验证和密码相关的功能,我们不希望其他人修改它们。

我听说在期末课上批改分数可以提高效率,但坦率地说,我觉得这个论点没有多大分量。

如果Java是面向对象的,并且你声明了一个final类,不是吗 停止类具有对象特征的想法?

也许是的,但有时这就是预期的目的。有时我们这样做是为了获得更大的安全性等好处,牺牲了这个类的扩展能力。但是final类仍然可以在需要时扩展一个类。

另一方面,我们应该更喜欢组合而不是继承,final关键字实际上有助于执行这一原则。

其他回答

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

主要引用:

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

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

Android Looper类就是一个很好的例子。 http://developer.android.com/reference/android/os/Looper.html

Looper类提供了某些不打算被任何其他类覆盖的功能。因此,这里没有子类。

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

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

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

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

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

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

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