在C#中,Java的final
相当于什么?
final
关键字在Java中有几种用法。它对应于C#中的sealed
和readonly
关键字,具体取决于使用它的上下文。
要防止子类化(从定义的类继承):
Java的
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
防止覆盖virtual
方法。
Java的
public class MyClass
{
public final void myFinalMethod() {...}
}
C#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
正如Joachim Sauer所指出的,这两种语言之间的显着差异是Java默认将所有非静态方法标记为virtual
,而C#将它们标记为sealed
。因此,如果要停止进一步覆盖已在基类中明确标记为sealed
的方法,则只需在C#中使用virtual
关键字。
仅允许为变量分配一次:
Java的
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
作为旁注,readonly
关键字的效果与const
关键字的效果不同,因为readonly
表达式是在运行时而不是编译时计算的,因此允许任意表达式。
这取决于具体情况。
final
类或方法,C# equivalent is sealed
。final
场,C# equivalent is readonly
。final
局部变量或方法参数,没有直接的C#等价物。这里缺少的是Java对最终成员变量的明确赋值的保证。
对于具有最终成员变量V的C类,通过C的每个构造函数的每个可能的执行路径必须恰好分配V一次 - 未能分配V或分配V两次或更多次将导致错误。
C#的readonly关键字没有这样的保证 - 编译器非常乐意将readonly成员保留为未分配或允许您在构造函数中多次分配它们。
所以,final和readonly(至少就成员变量而言)绝对不是等价的 - final更加严格。
Java类final和方法final - > sealed。 Java成员变量final - > readonly用于运行时常量,const用于编译时常量。
没有等效的Local Variable final和method参数final
如上所述,sealed
相当于final
的方法和类。
至于其余的,它很复杂。
const
可以被认为是等价的,只要它是原始类型或不可变类。readonly
,但它不相等 - 即使在构造函数中,final
也只需要一个赋值。总而言之,C#没有直接相当于final
。虽然Java缺乏C#的一些不错的功能,但对于我来说,作为一个Java程序员来看,C#无法提供等价的东西让我感到耳目一新。
C#常量使用const关键字声明编译时常量,或者使用readonly关键字声明运行时常量。常量的语义在C#和Java语言中都是相同的。
密封