C# 密封与 Java 最终版本

2022-09-02 05:01:22

有人会告诉我,为什么下面的使用没有编译?然而,如果我用Java替换并编译它,它就可以工作了。sealedsealedfinal

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

答案 1

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

在Java中可以应用于:final

  • ,这意味着该类不能被继承。这相当于 C#的 。sealed
  • 方法,这意味着无法在派生类中重写该方法。这是 C# 中的默认值,除非您将方法声明为派生类,否则可以再次阻止进一步的派生类使用此方法。这就是为什么你在C#中看到的成员比Java中的成员少得多的原因。virtualsealedsealedfinal
  • 字段变量,这意味着它们只能初始化一次。对于字段,C# 中的等效项是 。readonly

答案 2

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

在实践中,标记为保证为继承树中最后一个“叶子”的类型,或者简而言之,不能从像 .sealedsealed

public sealed class Child : Base 
{
}

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

它不能应用于成员。


推荐