18

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

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

3 回答 3

66

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

在Javafinal中可以应用于:

  • classes,这意味着该类不能被继承。这相当于 C# 的sealed.
  • methods,这意味着该方法不能在派生类中被覆盖。这是 C# 中的默认设置,除非您virtual在派生类中声明一个方法,否则可以再次使用其他派生类来防止这种情况发生sealed。这就是为什么你看到sealedC# 中的成员比finalJava 中的成员少得多的原因。
  • fieldsvariables,这意味着它们只能被初始化一次。对于字段,C# 中的等价物是readonly.
于 2012-04-16T08:12:55.673 回答
6

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

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

public sealed class Child : Base 
{
}

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

它不能应用于成员。

于 2012-04-16T08:13:51.213 回答
2

Tigran 的回答没有错,而 Joey 的回答有点不正确。
首先你可以看看这个页面:什么是C#中Java的final的等价物?. 关键字可以应用于
,但不能应用于变量或接口的方法。类不能被继承。戴法时,必须在公司。Every is ,所以不能被继承。检查此图像:sealedclassinstance methodpropertysealedsealedoverridestructsealedstruct密封使用

于 2014-05-30T06:54:54.263 回答