我正在读一本关于Java的书,它说你可以将整个类声明为final。我想不出有什么地方可以用它。
我只是一个编程新手,我想知道程序员是否真的在他们的程序中使用这个。如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。
如果Java是面向对象的,并且你声明了一个final类,难道它不会阻止类具有对象的特征吗?
我正在读一本关于Java的书,它说你可以将整个类声明为final。我想不出有什么地方可以用它。
我只是一个编程新手,我想知道程序员是否真的在他们的程序中使用这个。如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。
如果Java是面向对象的,并且你声明了一个final类,难道它不会阻止类具有对象的特征吗?
当前回答
其他的答案集中在final类告诉编译器什么:不允许另一个类声明它扩展了这个类,以及为什么这样做是可取的。
但是编译器并不是短语final类的唯一读者。每个读源代码的程序员也会读这个。它可以帮助快速理解程序。
In general, if a programmer sees Thing thing = that.someMethod(...); and the programmer wants to understand the subsequent behaviour of the object accessed through the thing object-reference, the programmer must consider the Thing class hierarchy: potentially many types, scattered over many packages. But if the programmer knows, or reads, final class Thing, they instantly know that they do not need to search for and study so many Java files, because there are no derived classes: they need study only Thing.java and, perhaps, it's base classes.
其他回答
把FINAL看作是“线的尽头”——那个家伙再也不能生育后代了。所以当你这样看的时候,有很多现实世界的场景,你会遇到,需要你标记一个'结束行'标记类。这是领域驱动设计——如果你的领域要求一个给定的实体(类)不能创建子类,那么把它标记为FINAL。
我应该指出,没有什么可以阻止您继承一个“应该标记为final”的类。但这通常被归类为“滥用继承”,这样做是因为大多数情况下你想从你的类的基类继承一些函数。
最好的方法是查看领域,并让它决定您的设计决策。
首先,我推荐这篇文章:Java:何时创建最终类
如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。
final类只是一个不能扩展的类。
(这并不意味着对该类对象的所有引用都将被声明为final。)
何时将一个类声明为final是有用的,这在这个问题的答案中涵盖:
在Java中禁止继承的好理由?
如果Java是面向对象的,并且你声明了一个final类,难道它不会阻止类具有对象的特征吗?
在某种意义上是的。
通过将一个类标记为final,您将禁用该语言的这部分代码的强大而灵活的特性。然而,有些类不应该(在某些情况下也不能)在设计时很好地考虑到子类化。在这些情况下,将类标记为final是有意义的,尽管它限制了OOP。(记住,final类仍然可以扩展另一个非final类。)
关键字final本身意味着某些东西是最终的,不应该以任何方式修改。如果一个类被标记为final,那么它就不能被扩展或子类化。但问题是我们为什么要做期末考?在我看来,原因有很多:
标准化:一些类执行标准函数,它们是不打算被修改的,例如类执行与字符串操作或数学函数相关的各种函数等。 安全原因:有时我们编写的类执行各种身份验证和密码相关的功能,我们不希望其他人修改它们。
我听说在期末课上批改分数可以提高效率,但坦率地说,我觉得这个论点没有多大分量。
如果Java是面向对象的,并且你声明了一个final类,不是吗 停止类具有对象特征的想法?
也许是的,但有时这就是预期的目的。有时我们这样做是为了获得更大的安全性等好处,牺牲了这个类的扩展能力。但是final类仍然可以在需要时扩展一个类。
另一方面,我们应该更喜欢组合而不是继承,final关键字实际上有助于执行这一原则。
Final类不能进一步扩展。如果不需要在java中使类可继承,可以使用这种方法。
如果我们只需要让一个类中的特定方法不被覆盖,我们可以把final关键字放在它们前面。在那里类仍然是可继承的。
最好的例子是
公共最终类
这是一个不可变的类,不能扩展。 当然,不仅仅是使类final为不可变。