我正在读一本关于Java的书,它说你可以将整个类声明为final。我想不出有什么地方可以用它。
我只是一个编程新手,我想知道程序员是否真的在他们的程序中使用这个。如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。
如果Java是面向对象的,并且你声明了一个final类,难道它不会阻止类具有对象的特征吗?
我正在读一本关于Java的书,它说你可以将整个类声明为final。我想不出有什么地方可以用它。
我只是一个编程新手,我想知道程序员是否真的在他们的程序中使用这个。如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。
如果Java是面向对象的,并且你声明了一个final类,难道它不会阻止类具有对象的特征吗?
当前回答
要解决最后一个类问题:
有两种方法可以让一门课成为期末考试。第一种是在类声明中使用关键字final:
public final class SomeClass {
// . . . Class contents
}
使类成为final的第二种方法是将其所有构造函数声明为private:
public class SomeClass {
public final static SOME_INSTANCE = new SomeClass(5);
private SomeClass(final int value) {
}
如果您发现它实际上是final,那么将它标记为final可以省去麻烦,请查看这个Test类。乍一看是公开的。
public class Test{
private Test(Class beanClass, Class stopClass, int flags)
throws Exception{
// . . . snip . . .
}
}
不幸的是,由于类的唯一构造函数是private的,因此不可能扩展这个类。在Test类的情况下,没有理由该类应该是final类。Test类是隐式final类如何导致问题的一个很好的例子。
所以当你隐式地将一个类的构造函数设为private时,你应该将它标记为final。
其他回答
如上所述,如果你想让任何人都不能改变方法的功能,那么你可以将它声明为final。
示例:用于下载/上传的应用服务器文件路径,基于偏移量拆分字符串,这样的方法你可以将其声明为Final,这样这些方法函数就不会被改变。如果你想要这样的final方法在一个单独的类中,那么将这个类定义为final类。所以Final类将拥有所有Final方法,而Final方法可以在非Final类中声明和定义。
在一个场景中,final很重要,当您出于安全原因想要防止类的继承时。这允许您确保您正在运行的代码不会被其他人覆盖。
另一个场景是为了优化:我似乎记得Java编译器内联了final类中的一些函数调用。因此,如果你调用a.x()并且a被声明为final,我们在编译时就知道代码将是什么,并且可以内联到调用函数中。我不知道这是否真的做到了,但最终是有可能的。
关键字final本身意味着某些东西是最终的,不应该以任何方式修改。如果一个类被标记为final,那么它就不能被扩展或子类化。但问题是我们为什么要做期末考?在我看来,原因有很多:
标准化:一些类执行标准函数,它们是不打算被修改的,例如类执行与字符串操作或数学函数相关的各种函数等。 安全原因:有时我们编写的类执行各种身份验证和密码相关的功能,我们不希望其他人修改它们。
我听说在期末课上批改分数可以提高效率,但坦率地说,我觉得这个论点没有多大分量。
如果Java是面向对象的,并且你声明了一个final类,不是吗 停止类具有对象特征的想法?
也许是的,但有时这就是预期的目的。有时我们这样做是为了获得更大的安全性等好处,牺牲了这个类的扩展能力。但是final类仍然可以在需要时扩展一个类。
另一方面,我们应该更喜欢组合而不是继承,final关键字实际上有助于执行这一原则。
在Java中,不能更改带有final修饰符的项!
这包括final类、final变量和final方法:
final类不能被任何其他类扩展 最终变量不能被重新赋值 final方法不能被覆盖
面向对象不是关于继承,而是关于封装。继承会破坏封装。
在很多情况下,声明类final是非常有意义的。任何代表“价值”的对象,如颜色或金额,都可能是最终的。他们是独立的。
如果您正在编写类库,请将类设为final,除非您显式地将它们缩进以派生。否则,人们可能会派生你的类并重写方法,破坏你的假设/不变量。这也可能有安全隐患。
Joshua Bloch在《Effective Java》一书中建议明确地为继承而设计,或者禁止为继承而设计,他指出为继承而设计并不是那么容易。