首页 文章

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

提问于
浏览
523

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

7 回答

  • 0

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

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

    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 关键字 .

    变量

    仅允许为变量分配一次:

    Java

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

    C#

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

    作为旁注, readonly 关键字的效果与const关键字的效果不同,因为 readonly 表达式是在运行时而不是编译时计算的,因此允许任意表达式 .

  • 6

    这取决于具体情况 .

  • 6

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

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

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

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

  • 813

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

    没有等效的Local Variable final和method参数final

  • 40

    如上所述,对于方法和类, sealed 相当于 final .

    至于其余的,它很复杂 .

    • 在声明中定义的(静态)常量上, const 可以被认为是等价的,只要它是基本类型或不可变类 .

    • 在一个离开构造函数后不应重新赋值的字段上,可以使用 readonly ,但它不相等 - 即使在构造函数中, final 也只需要一个赋值 .

    • 我猜想,在C#中无法创建一个应该只分配一次的局部变量 . 如果你想知道为什么有人需要它:你可以在一些if-else之前声明一个变量,switch-case左右 . 通过将其声明为final,您强制执行一次,如果没有,则会发生编译器错误 . 这需要表现良好的代码,因此错误更少 .

    总结起来,C#没有直接等同于 final . 虽然Java缺乏C#的一些不错的功能,但对于我来说,作为一个Java程序员来看,C#无法提供等价的东西让我感到耳目一新 .

  • 5

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

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

  • 165

    密封

相关问题