【发布时间】:2009-08-29 14:29:02
【问题描述】:
final 关键字可以用于方法吗?
【问题讨论】:
-
最好在提问之前先做一些“家庭作业”。问完全没问题。对此没有异议。但我认为我们应该问每一件事。谷歌搜索给出了第一个命中。 en.wikipedia.org/wiki/Final_%28Java%29#Final_methods
final 关键字可以用于方法吗?
【问题讨论】:
绝对! final 关键字几乎可以应用于任何事物,在每种情况下都意味着“你不能再改变它了”。
以下是应用于...时的含义
变量:您根本无法为变量分配新值(当然,将其呈现为常量)
方法:您不能在子类中重新实现(即覆盖)此方法
类:不能定义子类
在每种情况下,我们只是表明:一旦声明了这个东西,这就是你将看到的最后一个值(或实现)。
【讨论】:
final,引用类型也可能不是不可变的?如果是这样,那超出了原始问题的范围。但是,欢迎您以任何您认为会增强现有答案的方式进行建设性评论。不过,由于此答案已有数年历史,并且迄今为止仅被查看了 528 次,因此我建议您将精力集中在更当前的问题上。
是的,可以将方法声明为final。这意味着方法不能被其子类覆盖。
来自The Java Language Specifications, Third Edition,Section 8.4.3.3:
一个方法可以声明为final 防止子类覆盖或 隐藏它。这是一个编译时错误 试图覆盖或隐藏决赛 方法。
更多信息,The Java Tutorials 的Writing Final Classes and Methods 页面有更多信息。
【讨论】:
是的。
你可以使一个方法最终
public class A {
public static final void f() {
System.out.println("test");
}
}
使方法成为最终方法通常有两个原因
【讨论】:
当然可以。使其无法覆盖。
【讨论】:
好的,请查看The Final Word on the Final Keyword
public abstract class AbstractBase
{
public final void performOperation() // cannot be overridden
{
prepareForOperation();
doPerformOperation();
}
protected abstract void doPerformOperation(); // must override
}
【讨论】:
是的。
最终方法不能被子类覆盖。这通常用于防止子类改变类的关键行为。
【讨论】:
作为其他答案的注释。您可以使用 final。在实践中,我很少看到有人使用它,我不知道为什么。
这些天我写的很多代码都是为多线程环境而设计的,我倾向于使 final 类成为不可变的(如果它是一个值类),以便它是线程安全的。
将某些方法标记为最终方法(而不是其他方法)的问题在于,您是在声明该方法有一些特别之处,而其他方法没有什么特别之处。根据我的经验,这很少是人们真正的意思。
如果一个类是为了继承而设计的,你需要保持它干净并保持它的小,以防止不必要的副作用。所有这一切都取决于您是为自己和团队编写代码,还是为更广泛的受众编写代码 - 即开源项目或商业项目的公共 API。
【讨论】:
是的,final 关键字可以用于方法。它将保持不变性。它可以防止方法之间被破坏。例如,假设 X 类的某个方法的实现假定方法 M 将以某种方式运行。将 X 或 M 声明为 final 将防止派生类重新定义 M 以导致 X 行为不正确。
【讨论】: