【问题标题】:Confusion regarding access specifiers in Java and C#关于 Java 和 C# 中的访问说明符的混淆
【发布时间】:2012-09-06 05:33:04
【问题描述】:

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

我有两个问题

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

【问题讨论】:

    标签: c# java keyword access-specifier


    【解决方案1】:

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

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

    我怎样才能保护 C#(访问仅限于包含 类或派生自包含类的类型。)在 Java 中?

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

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

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

    Here's the complete grid

    【讨论】:

    • “请注意不要制作过于捆绑且难以更改和维护的东西”。我不明白。修饰符如何在其中发挥作用?
    • 当你有子类访问一个内部字段时,你有一个强耦合禁止你改变超类的实现。这是封装有助于避免的问题之一。
    【解决方案2】:

    在 Java API 文档中,Sun.com 不提供关键字访问说明符。试试这个例子

    D:\>javac Demo.java
    Demo.java:1: error: **modifier** private not allowed here
    private class Test
            ^
    1 error
    

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 2014-01-11
      • 1970-01-01
      • 2011-01-31
      • 2014-12-31
      • 2011-04-11
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多