C#中的Java final
相当于什么?
答案 0 :(得分:822)
final
关键字在Java中有几种用法。它对应于C#中的sealed
和readonly
关键字,具体取决于使用它的上下文。
要防止子类化(从定义的类继承):
Java
public final class MyFinalClass {...}
<强> C#强>
public sealed class MyFinalClass {...}
防止覆盖virtual
方法。
<强>爪哇强>
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
关键字。
仅允许为变量分配一次:
<强>爪哇强>
public final double pi = 3.14; // essentially a constant
<强> C#强>
public readonly double pi = 3.14; // essentially a constant
作为旁注,readonly
关键字的效果与const
关键字的效果不同,因为readonly
表达式是在运行时评估的比编译时,因此允许任意表达。
答案 1 :(得分:167)
这取决于具体情况。
final
类或方法,C# equivalent is sealed
。final
字段,C# equivalent is readonly
。final
局部变量或方法参数,没有直接的C#等价物。答案 2 :(得分:41)
这里缺少的是Java对最终成员变量的明确赋值的保证。
对于具有最终成员变量V的C类,通过C的每个构造函数的每个可能的执行路径必须恰好分配V一次 - 未能分配V或分配V两次或更多次将导致错误。
C#的readonly关键字没有这样的保证 - 编译器非常乐意将readonly成员保留为未分配或允许您在构造函数中多次分配它们。
所以,final和readonly(至少就成员变量而言)肯定不相同 - final更严格。
答案 3 :(得分:7)
如前所述,sealed
相当于方法和类的final
。
至于其他方面,这很复杂。
const
可以被认为是等价的,前提是它是基本类型或不可变类。readonly
,但它不相等 - 即使在构造函数中,final
也只需要一个赋值。总结一下,C#与final
没有直接对应关系。虽然Java缺少C#的一些不错的功能,但对于我来说,作为一名Java程序员来看,C#无法提供相同的功能,这让我感到耳目一新。
答案 4 :(得分:6)
Java class final和method final - &gt;密封。 Java成员变量final - &gt; readonly用于运行时常量,const用于编译时常量。
没有等效的Local Variable final和method argument final
答案 5 :(得分:5)
使用const关键字为编译时常量或运行时常量的readonly关键字声明C#常量。常量的语义在C#和Java语言中都是相同的。
答案 6 :(得分:0)
密封