为什么在Java中我们需要使用final class?

10 浏览
0 Comments

为什么在Java中我们需要使用final class?

我正在阅读一本关于Java的书,书中说你可以将整个类声明为final。我想不出有什么情况下我会用到这个特性。\n我刚刚开始学编程,我想知道程序员们实际上是否在他们的程序中使用这个特性。如果使用,他们何时使用它,这样我就能更好地理解并知道何时使用。\n如果Java是面向对象的,而你将一个类声明为final,那不是停止了类具有对象特性的概念吗?

0
0 Comments

为什么我们需要在Java中使用final类?

在Java中,有时候我们需要使用final关键字来声明一个类,这是为了防止类被继承,以达到安全的目的。这样可以确保我们运行的代码不会被其他人重写。

另一种情况是为了优化代码。据我所记,Java编译器会对final类的一些函数调用进行内联。所以,如果我们调用了a.x(),并且a被声明为final,编译器在编译时就能确定代码的具体内容,并将其内联到调用函数中。我不确定编译器是否真的这样做了,但这是一个可能的情况。

通常情况下,内联是由即时编译器在运行时进行的。即时编译器也可以在没有final关键字的情况下进行内联,但需要做更多的工作来确保没有其他类继承了该方法,或者这些继承类没有改变该方法。

关于内联和优化问题的一个很好的解释可以在这里找到:lemire.me/blog/archives/2014/12/17/…

无法被其他人重写,但是不能被谁重写?

我认为这里的安全性是以一种几乎令人困惑的学术意义上的安全来使用的。这里的安全是指当你使用一个类时,你知道其他类没有继承它,并且不依赖于基类的内部实现。我们经常遇到一些类以各种恶心的方式被继承,而且很难在没有耗费大量时间的情况下分析代码。

在Java中,使用final关键字可以防止类被继承,以达到安全的目的。此外,final类的函数调用可以在编译时内联,提高代码的执行效率。通过使用final类,我们可以确保代码的正确性和可靠性,避免其他类对基类的不当继承和修改带来的问题。

0
0 Comments

为什么我们在Java中需要final类?

在Java中,使用final修饰符的项目是不可改变的!这包括final类、final变量和final方法:

- final类不能被其他类继承

- final变量不能被重新赋值

- final方法不能被重写

实际的问题是为什么需要这样做,而不是这些东西是什么。

事实上,"在Java中,使用final修饰符的项目是不可改变的!"这个陈述过于绝对,并且事实上并不完全正确。正如Grady Booch所说,"一个对象具有状态、行为和标识"。虽然一旦一个对象的引用被标记为final后,我们无法改变它的标识,但我们仍然有机会通过给它的非final字段分配新值来改变它的状态(前提是它有这些字段)。计划获得Oracle Java认证(如1Z0-808等)的人应该记住这一点,因为考试中可能会涉及到这个方面的问题...

解决办法:

- 如果不想让某个类被继承,可以将其声明为final类。这样可以确保其他类无法继承它,从而保护类的实现细节和安全性。

- 如果不希望某个变量被重新赋值,可以将其声明为final变量。这样可以避免在程序中意外修改变量的值,提高代码的可读性和安全性。

- 如果希望某个方法在子类中不能被重写,可以将其声明为final方法。这样可以确保方法的实现不会被子类修改,从而保持方法的一致性和可靠性。

final类、final变量和final方法在Java中的使用可以提供更好的代码安全性、可读性和可维护性。通过限制类的继承、变量的重新赋值和方法的重写,可以确保程序的稳定性和一致性。对于准备获得Java认证的人来说,了解final修饰符的作用和限制是很重要的。

0
0 Comments

为什么我们需要在Java中使用final class?

首先,我推荐阅读这篇文章:Java: When to create a final class

一个final class是指不能被继承的类。

(这并不意味着对该类的所有对象引用都会像声明为final一样行事。)

何时有必要将一个类声明为final,在这个问题的答案中有所涉及:

- Good reasons to prohibit inheritance in Java?

某种程度上是的。

通过将类标记为final,您禁用了语言中该部分代码的一种强大而灵活的特性。然而,有一些类不应该(在某些情况下甚至不能)被设计为考虑到子类化的方式。在这些情况下,将类标记为final是有意义的,即使它限制了面向对象编程。 (请记住,final类仍然可以扩展另一个非final类。)

此外,Effective Java的原则之一是倾向于组合而不是继承。使用final关键字也有助于强制实施这一原则。

“你这样做主要是出于效率和安全原因。”我经常听到这种说法(即使维基百科也这样说),但我仍然不理解这个观点背后的理由。有人可以解释一下,比如一个非final的java.lang.String会以何种方式既低效又不安全吗?

如果我创建一个接受String作为参数的方法,我假设它是不可变的,因为String本身是不可变的。由于这个原因,我知道我可以安全地在String对象上调用任何方法,而不会改变传递的String。如果我扩展String,并改变substring的实现以改变实际的String,那么你所期望的不可变的String对象就不再是不可变的了。

为什么不将substring声明为final,然后使String可以扩展呢?这将与Sean Patrick Floyd在他的帖子中提到的“开闭原则”保持一致。

因为不仅仅是substring。String作为一个合约是完全不可变的。一旦你扩展它,它就不再是一个保证了。当你在语言中有这样的东西时,最好就不要让人们改变它了...

而且,一旦你说你希望所有的String方法和字段都是final的,只是为了创建一些具有附加功能的类... 在那时,你不妨创建一个具有string的类并创建在该字符串上操作的方法。

final(除其他外)用于使对象不可变,所以我不会说它们与彼此无关。请参见这里:docs.oracle.com/javase/tutorial/essential/concurrency/…

这个答案依赖于外部来源提供详细信息。如果外部URL失效,您应该编辑答案并包含详细信息。

有些类不应该被设计为考虑到子类化的方式,final关键字有助于实现这一点。此外,它还可以用于使对象不可变,以提高效率和安全性。在某些情况下,使用final class可以更好地实现代码的设计原则和规范。

0