在C#中Java的最终结果是什么?

时间:2009-08-25 11:05:44

标签: c# access-modifiers reserved-words

C#中的Java final相当于什么?

7 个答案:

答案 0 :(得分:822)

final关键字在Java中有几种用法。它对应于C#中的sealedreadonly关键字,具体取决于使用它的上下文。

要防止子类化(从定义的类继承):

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)

这取决于具体情况。

答案 2 :(得分:41)

这里缺少的是Java对最终成员变量的明确赋值的保证。

对于具有最终成员变量V的C类,通过C的每个构造函数的每个可能的执行路径必须恰好分配V一次 - 未能分配V或分配V两次或更多次将导致错误。

C#的readonly关键字没有这样的保证 - 编译器非常乐意将readonly成员保留为未分配或允许您在构造函数中多次分配它们。

所以,final和readonly(至少就成员变量而言)肯定不相同 - final更严格。

答案 3 :(得分:7)

如前所述,sealed相当于方法和类的final

至于其他方面,这很复杂。

  • 在声明中定义的(静态)常量上,const可以被认为是等价的,前提是它是基本类型或不可变类。
  • 在一个离开构造函数时不应该重新分配的字段上,可以使用readonly,但它不相等 - 即使在构造函数中,final也只需要一个赋值。
  • 我想,无法在C#中创建一次只能分配一次的局部变量。如果你想知道为什么有人会需要它:你可以在一些if-else之前声明一个变量,switch-case左右。通过将其声明为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)

http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations

使用const关键字为编译时常量或运行时常量的readonly关键字声明C#常量。常量的语义在C#和Java语言中都是相同的。

答案 6 :(得分:0)

密封