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

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

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


当前回答

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

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

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

其他回答

首先,我推荐这篇文章:Java:何时创建最终类


如果他们使用,他们什么时候使用,这样我就能更好地理解它,知道什么时候使用它。

final类只是一个不能扩展的类。

(这并不意味着对该类对象的所有引用都将被声明为final。)

何时将一个类声明为final是有用的,这在这个问题的答案中涵盖:

在Java中禁止继承的好理由?

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

在某种意义上是的。

通过将一个类标记为final,您将禁用该语言的这部分代码的强大而灵活的特性。然而,有些类不应该(在某些情况下也不能)在设计时很好地考虑到子类化。在这些情况下,将类标记为final是有意义的,尽管它限制了OOP。(记住,final类仍然可以扩展另一个非final类。)

相关阅读:Bob Martin的《开闭原理》。

主要引用:

软件实体(类、模块、 函数等)应该是开放的 分机,但已关闭 修改。

最后一个关键字是在Java中强制执行的方法,无论是在方法上还是在类上。

如上所述,如果你想让任何人都不能改变方法的功能,那么你可以将它声明为final。

示例:用于下载/上传的应用服务器文件路径,基于偏移量拆分字符串,这样的方法你可以将其声明为Final,这样这些方法函数就不会被改变。如果你想要这样的final方法在一个单独的类中,那么将这个类定义为final类。所以Final类将拥有所有Final方法,而Final方法可以在非Final类中声明和定义。

Android Looper类就是一个很好的例子。 http://developer.android.com/reference/android/os/Looper.html

Looper类提供了某些不打算被任何其他类覆盖的功能。因此,这里没有子类。

要解决最后一个类问题:

有两种方法可以让一门课成为期末考试。第一种是在类声明中使用关键字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。