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

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

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


当前回答

Final类不能进一步扩展。如果不需要在java中使类可继承,可以使用这种方法。

如果我们只需要让一个类中的特定方法不被覆盖,我们可以把final关键字放在它们前面。在那里类仍然是可继承的。

其他回答

最好的例子是

公共最终类

这是一个不可变的类,不能扩展。 当然,不仅仅是使类final为不可变。

在Java中,不能更改带有final修饰符的项!

这包括final类、final变量和final方法:

final类不能被任何其他类扩展 最终变量不能被重新赋值 final方法不能被覆盖

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

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

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

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

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

另一方面,我们应该更喜欢组合而不是继承,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”的类。但这通常被归类为“滥用继承”,这样做是因为大多数情况下你想从你的类的基类继承一些函数。

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