601

finalC#中Java的等价物是什么?

4

7 回答 7

907

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

课程

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

爪哇

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因此,如果您想停止进一步覆盖已virtual在基类中显式标记的方法,则只需在 C# 中使用关键字。

变量

只允许一个变量被赋值一次:

爪哇

public final double pi = 3.14; // essentially a constant

C#

public readonly double pi = 3.14; // essentially a constant

附带说明一下,关键字的效果与readonly关键字的效果不同,const因为readonly表达式是在运行时而不是在编译时计算的,因此允许任意表达式。

于 2009-08-25T11:06:32.087 回答
202

这取决于上下文。

于 2009-08-25T11:06:45.267 回答
50

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

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

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

所以,final 和 readonly(至少就成员变量而言)绝对不等价 - final 更加严格。

于 2010-05-07T18:45:41.550 回答
7

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

至于其他的,就复杂了。

  • 对于static final字段,static readonly是最接近的可能。它允许您在静态构造函数中初始化静态字段,这与 Java 中的静态初始化器非常相似。这适用于常量(基元和不可变对象)和对可变对象的常量引用。

    修饰符与const常量非常相似,但您不能在静态构造函数中设置它们。

  • 可以在离开构造函数后不应重新分配的字段上readonly使用。但它并不相等 -final即使在构造函数或初始化程序中也需要一个赋值。

  • final我知道的局部变量没有 C# 等效项。如果您想知道为什么有人需要它:您可以在 if-else、 switch-case等之前声明一个变量。通过将其声明为最终的,您强制它最多分配一次。

    Java 局部变量通常需要在读取之前至少分配一次。除非分支在读取值之前跳出,否则最终变量只会分配一次。所有这些都是在编译时检查的。这需要行为良好的代码,错误的余地较小。

总而言之,C# 没有直接等效的final. 虽然 Java 缺少 C# 的一些不错的特性,但作为一个主要是 Java 程序员的我,看到 C# 未能提供等价物的地方让我感到耳目一新。

于 2015-02-19T09:05:51.453 回答
6

Java 类 final 和方法 final -> 密封。Java 成员变量 final -> readonly 用于运行时常量, const 用于编译时常量。

局部变量 final 和方法参数 final 没有等效项

于 2009-08-25T11:20:33.633 回答
5

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

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

于 2009-08-25T11:08:28.133 回答
1

密封

于 2009-08-25T11:07:05.343 回答