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