5

final关键字可以用于方法吗?

4

8 回答 8

19

绝对地!final关键字几乎可以应用于任何事情,在每种情况下都意味着“你不能再改变它了” 。

这就是应用于...时的含义

变量:您根本无法为变量分配新值(当然,将其呈现为常量

方法:您不能在子类中重新实现(即覆盖)此方法

一个类:你不能定义一个子类

在每种情况下,我们只是简单地表明:一旦声明了这个东西,这就是你将看到的最后一个值(或实现)。

于 2009-08-29T14:32:53.483 回答
3

是的,可以将方法声明为final. 这意味着方法不能被其子类覆盖。

来自Java 语言规范,第三版第 8.4.3.3 节

可以将方法声明为 final 以防止子类覆盖或隐藏它。尝试覆盖或隐藏最终方法是编译时错误。

有关更多信息,Java 教程中的编写最终类和方法页面有更多信息。

于 2009-08-29T14:33:00.860 回答
2

是的。

你可以使一个方法最终

public class A {
   public static final void f() {
      System.out.println("test");
   }
}

使方法成为最终方法通常有两个原因

  1. 当一个方法是最终的,它“可能”被内联。
  2. 当一个方法是 final 时,该方法是不可能被覆盖的。
于 2009-08-29T14:30:02.660 回答
1

当然可以。使其无法覆盖。

于 2009-08-29T14:31:40.097 回答
0

当然,请查看Final Keyword 上的 The Final Word

public abstract class AbstractBase
{
    public final void performOperation()    // cannot be overridden
    {
        prepareForOperation();
        doPerformOperation();   
    }

    protected abstract void doPerformOperation();    // must override
}
于 2009-08-29T14:32:39.613 回答
0

是的。

final 方法不能被子类覆盖。这通常用于防止子类改变类的关键行为。

于 2009-08-29T14:33:55.447 回答
0

作为其他答案的注释。你可以使用final。在实践中,我很少看到有人使用它,我不知道为什么。

这些天我写的很多代码都是为多线程环境而设计的,我倾向于使 final 类成为不可变的(如果它是一个值类),以便它是线程安全的。

将某些方法标记为最终方法(而不是其他方法)的问题在于,您声明该方法有一些特别之处,而其他方法没有什么特别之处。根据我的经验,这很少是人们真正的意思。

如果一个类是为了继承而设计的,你需要保持它干净并保持它的小,以防止不必要的副作用。所有这一切都取决于您是为自己和团队编写代码,还是为更广泛的受众编写代码——即开源项目或商业项目的公共 API。

于 2009-08-29T15:17:15.110 回答
0

是的,final 关键字可用于方法。它将保持不变性。它可以防止方法之间被破坏。例如,假设 X 类的某个方法的实现假定方法 M 将以某种方式运行。将 X 或 M 声明为 final 将防止派生类重新定义 M 以导致 X 行为不正确。

于 2015-07-28T19:34:22.730 回答