Java在C#中的最终效果是什么?
Java在C#中的final
是什么?
final
关键字在Java中有几种用法。 它对应于C#中的sealed
关键字和readonly
关键字,具体取决于它使用的上下文。
类
防止inheritance(从定义的类inheritance):
Java的
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
方法
防止重写virtual
方法。
Java的
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
关键字。
variables
只允许一个variables分配一次:
Java的
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
另外, readonly
关键字的作用与const
关键字的作用不同,因为readonly
expression式是在运行 时而不是编译时计算的 ,因此允许任意expression式。
这取决于上下文。
- 对于
final
类或方法, C#等价物是sealed
。 - 对于
final
字段, C#等价物是readonly
。 - 对于
final
局部variables或方法参数,没有直接的C#等价物。
这里的每个人都缺less的是Java对最终成员variables的明确赋值的保证。
对于具有最终成员variablesV的类C,通过C的每个构造函数的每个可能的执行path都必须分配V一次 – 无法分配V或分配V两次或更多次将导致错误。
C#的readonly关键字没有这样的保证 – 编译器非常乐意让readonly成员不被分配,或者允许你在一个构造函数中多次赋值。
所以,final和readonly(至less就成员variables而言)绝对不是等价的,final是更严格的。
Java类final和method final – >密封。 Java成员variablesfinal – > readonly为运行时常量,const为编译时常量。
没有等效的局部variablesfinal和method argument final
C#常量是使用编译时常量的const关键字或运行时常量的readonly关键字声明的。 常量的语义在C#和Java语言中都是相同的。
如前所述, sealed
对于方法和类来说是等价的。
至于其余,这是复杂的。
- 在声明中定义的(静态)常量上,
const
可以被认为是等价的,只要它是一个基本types或一个不可变类。 - 在离开构造函数时不应重新分配的字段中,只能使用
readonly
,但它不相等 – 即使在构造函数中,final
需要一个赋值。 - 我猜应该只能分配一次局部variables,不能用C#创build。 如果你想知道为什么有人需要它:你可以在if-else, switch-case等之前声明一个variables。 通过声明它是最终的,你强制它被分配一次,如果没有,编译器错误发生。 这需要良好行为的代码,所以有更less的错误。
总结起来,C#没有直接相当于final
。 虽然Java缺乏C#的一些很好的function,但对于我来说,作为大多数Java程序员来说,看起来C#不能提供相当的function是令人耳目一新的。
密封