final关键字在Java有几个用法。它对应于C#中的
sealed和
readonly关键字,具体取决于它使用的上下文。
类
为了防止子类化(从定义类继承):
Java
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
方法
防止覆盖虚拟方法。
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
正如Joachim Sauer指出的,这两种语言之间的一个显着区别是,Java默认将所有非静态方法标记为虚拟,而C#将它们标记为密封。因此,如果要停止进一步覆盖已在基类中显式标记为虚拟的方法,则只需要在C#中使用sealed关键字。
变量
仅允许分配变量一次:
Java
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
另一方面,readonly关键字的效果与const关键字的效果不同,因为表达式在运行时而不是编译时进行计算,因此允许任意表达式。