在C#中Java的最终版本相当于什么?

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


#1楼

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 。 因此,仅在要停止进一步重写已在基类中显式标记为virtual的方法时,才需要在C#中使用sealed关键字。

变数

仅允许一次分配变量:

爪哇

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

C#

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

附带说明一下, readonly关键字的效果与const关键字的效果不同,因为readonly表达式是在运行 时而不是在编译 求值的,因此可以使用任意表达式。


#2楼

这取决于上下文。


#3楼

密封


#4楼

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

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


#5楼

Java类final和方法final->密封。 Java成员变量final->只读表示运行时常量,const表示编译时间常量。

没有等效的局部变量fi​​nal和方法参数final


#6楼

这里每个人都缺少的是Java对最终成员变量进行明确分配的保证。

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

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

因此,final和readonly(至少在成员变量方面)绝对不相等-final更为严格。


#7楼

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

至于其他,则很复杂。

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

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

  • 在离开构造函数后不应重新分配的字段上,可以使用readonly 。 -虽然它不等于final需要,即使在构造函数或初始化程序只有一个任务。
  • 我所知道的final局部变量没有C#等效项。 如果您想知道为什么有人会需要它:您可以在if-else, switch-case左右之前声明一个变量。 通过最终声明,您可以强制对其最多分配一次。

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

总结起来,C#没有final直接等效项。 尽管Java缺少C#的一些出色功能,但对于大多数Java程序员来说,看到C#无法提供等效的东西对我来说是令人耳目一新的。

发布了0 篇原创文章 · 获赞 1 · 访问量 2544

猜你喜欢

转载自blog.csdn.net/asdfgh0077/article/details/103943662