关于Java和C#中访问说明符的困惑

Sha*_*wat 5 c# java keyword access-specifier

我在比较Java和C#中的访问修饰符.我想protected internal在Java中找到C#的替代品.但我注意到protected两种语言(C#Java)的修饰符都不同.protected在Java中相当于protected internalC#,因为成员也可以在同一个包中访问.

我有两个问题

  • 为什么他们在Java和C#中为同一个修饰符创建了不同的含义?
  • 如何在Java protected中使用C#(Access仅限于包含类或从包含类派生的类型.)?

Den*_*ret 2

为什么他们在 Java 和 C# 中为相同的修饰符创建了不同的含义?

必须在简单性和精确指定不同访问权限的能力之间做出选择。Java 的创建者和(后来)C# 的创建者做出了不同的选择。

如何在 Java 中保护 C#(访问仅限于包含类或从包含类派生的类型。)?

你不能。Java 在这一点上受到更多限制。

但是您可能应该限制关键字的使用,protected因为在这两种使用中都意味着破坏一般封装原则。这种用法有时很有用,因为过于严格的语言可能意味着过多无用的代码,但要注意不要制作过于束缚且难以更改和维护的东西。为重写类提供对内部字段或方法的访问通常意味着您有一个沉重的层次结构,并且实现耦合过多(为了可维护性,更喜欢组合而不是层次结构)。

请注意,未使用任何访问控制修饰符声明的变量或方法可用于同一包中的任何其他类。在我看来,这比允许任何包的子类访问更明智。

这是完整的网格

在此输入图像描述