我正在读一本关于Java的书,它说你可以将整个类声明为final。我想不出有什么地方可以用它。
我只是一个编程新手,我想知道程序员是否真的在他们的程序中使用这个。如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。
如果Java是面向对象的,并且你声明了一个final类,难道它不会阻止类具有对象的特征吗?
我正在读一本关于Java的书,它说你可以将整个类声明为final。我想不出有什么地方可以用它。
我只是一个编程新手,我想知道程序员是否真的在他们的程序中使用这个。如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。
如果Java是面向对象的,并且你声明了一个final类,难道它不会阻止类具有对象的特征吗?
当前回答
Android Looper类就是一个很好的例子。 http://developer.android.com/reference/android/os/Looper.html
Looper类提供了某些不打算被任何其他类覆盖的功能。因此,这里没有子类。
其他回答
如果您将类层次结构想象成一棵树(就像在Java中那样),抽象类只能是分支,最终类只能是叶。不属于这两个类别的类可以同时是分支和叶。
这里并没有违反OO原则,final只是提供了一个漂亮的对称性。
在实践中,如果你想让你的对象是不可变的,或者如果你正在编写一个API,你想要使用final来告诉API的用户这个类不是用于扩展的。
Be careful when you make a class "final". Because if you want to write an unit test for a final class, you cannot subclass this final class in order to use the dependency-breaking technique "Subclass and Override Method" described in Michael C. Feathers' book "Working Effectively with Legacy Code". In this book, Feathers said, "Seriously, it is easy to believe that sealed and final are a wrong-headed mistake, that they should never have been added to programming languages. But the real fault lies with us. When we depend directly on libraries that are out of our control, we are just asking for trouble."
将一个类保留为最终类的一个好处是:-
String类保持为final,这样任何人都不能重写其方法并更改功能。例如,没有人可以改变length()方法的功能。它总是返回一个字符串的长度。
这个类的开发人员不希望任何人改变这个类的功能,所以他把它作为最终的。
final类可以避免在添加新方法时破坏公共API
假设在基类的版本1中:
public class Base {}
客户会这样做:
class Derived extends Base {
public int method() { return 1; }
}
然后,如果在版本2中,你想添加一个方法method到Base:
class Base {
public String method() { return null; }
}
这将破坏客户端代码。
如果我们使用final类Base,客户端就不能继承,方法的添加也不会破坏API。
Final类不能进一步扩展。如果不需要在java中使类可继承,可以使用这种方法。
如果我们只需要让一个类中的特定方法不被覆盖,我们可以把final关键字放在它们前面。在那里类仍然是可继承的。