【问题标题】:C# sealed vs Java finalC#sealed vs Java final
【发布时间】:2012-04-27 13:50:36
【问题描述】:

有人能告诉我以下使用sealed 无法编译的原因吗?然而,如果我将 sealed 替换为 final 并将其编译为 Java,它就可以工作。

private sealed int compInt = 100;
public bool check(int someInt)
{
    if (someInt > compInt)
    {
        return true;
    }
    return false;
}

【问题讨论】:

标签: c# java sealed


【解决方案1】:

这是因为 Java 中的 final 意味着很多不同的东西,具体取决于您使用它的位置,而 C# 中的 sealed 应用于类和继承的虚拟成员(方法、属性、事件)。

在Java中final可以应用于:

  • classes,表示该类不能被继承。这相当于 C# 的 sealed
  • methods,表示该方法不能在派生类中被覆盖。这是 C# 中的默认设置,除非您将方法声明为 virtual,并且在派生类中,可以再次使用 sealed 阻止进一步的派生类。这就是为什么 C# 中的 sealed 成员比 Java 中的 final 成员少得多。
  • fieldsvariables,这意味着它们只能被初始化一次。对于 C# 中等价的字段,readonly

【讨论】:

  • “在 C# 中密封仅适用于类”——这不是真的,它可以应用于 C# 中的方法。
  • 只读字段可以在构造函数中修改(和Java的final有一点区别)
【解决方案2】:

C# 中的Sealed 只能应用于引用类型,并且对继承树有影响。

实际上,标记为sealed 的类型保证是继承树中的最后一个“叶子”,或者简而言之,您不能从像sealed 这样声明的类型派生。

public sealed class Child : Base 
{
}

public class AnotherAgain : Child //THIS IS NOT ALLOWED
{
}

它不能应用于成员。

【讨论】:

    【解决方案3】:

    Tigran 的答案没有错,而 Joey 的答案有点不正确。
    首先您可以查看此页面:What is the equivalent of Java's final in C#?
    sealed 关键字可以应用于classinstance methodproperty,但不能应用于变量或接口的方法。带有sealed 的类不能被继承。当sealed 穿法时,必须是override 在公司。每个struct 都是sealed,所以struct 不能被继承。检查此图像:

    【讨论】:

      猜你喜欢
      • 2013-02-08
      • 2011-01-05
      • 2015-11-18
      • 2020-09-24
      • 2013-09-02
      • 2012-10-01
      • 1970-01-01
      • 2014-04-16
      • 2011-11-24
      相关资源
      最近更新 更多