C# sealed vs Java final

21

请问为什么以下使用sealed的代码无法编译通过?但是如果将sealed替换为final并编译为Java,则可以正常工作。

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

1
https://dev59.com/cXI95IYBdhLWcg3w-DH0 - Chuck Norris
在C#中,成员的等效于finalreadonly - user166390
3个回答

68

这是因为在Java中,final的含义取决于使用它的位置,而在C#中,sealed仅适用于类和继承的虚成员(方法、属性、事件)。

在Java中,final可应用于:

  • ,这意味着该类不能被继承。这相当于C#的sealed
  • 方法,这意味着该方法不能在派生类中被重写。这是C#中的默认设置,除非你将一个方法声明为virtual,并且在派生类中可以再次使用sealed防止进一步的派生类重写该方法。这就是为什么在C#中很少看到sealed成员,而在Java中常常看到final成员的原因。
  • 字段变量,这意味着它们只能被初始化一次。对于字段,在C#中,相当于使用readonly

1
“sealed”在C#中不仅适用于类,它也可以应用于方法。 - Maxim
1
只读字段可以在构造函数中修改(与Java的final有一点不同)。 - DPM

7

C#中的Sealed关键字只能应用于引用类型,并对继承树产生影响。

实践中,被标记为sealed的类型保证是继承树中的最后一个“叶子节点”,简而言之,您不能从声明为sealed的类型派生出新类型。

public sealed class Child : Base 
{
}

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

这不能应用于成员。


2

Tigran的回答并没有错,而Joey的回答有点不正确。
首先你可以查看这个页面:Java中final在C#中的等价物是什么?
关键字sealed可以应用于class实例方法属性,但不能应用于变量或接口的方法。带有sealed的类不能被继承。当将sealed放在方法上时,它必须与override一起使用。每个struct都是sealed的,所以struct不能被继承。请查看此图片:sealed usage


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接