【问题标题】:Java Field HidingJava 字段隐藏
【发布时间】:2012-05-17 02:34:33
【问题描述】:

我想知道说一个字段隐藏在 2 个 java 类和 根据结果​​输出运行代码意味着什么?

我有一个带有protected static boolean field = false 和一个子类的抽象类 它有一个同名但不是静态的布尔字段并设置为true

如果我有这个代码:

Superclass d = new subclass();

超类中的布尔字段和布尔字段的值是多少 在子类中?上述分配后,子类字段是否保持为false

【问题讨论】:

    标签: java field instance-variables static-variables member-hiding


    【解决方案1】:
    • Java 语言规范

      如果类声明了一个具有特定名称的字段,则该字段的声明被称为隐藏在超类和该类的超接口中具有相同名称的任何和所有可访问的字段声明.

      如果隐藏字段是static,则可以通过使用限定名称或使用包含关键字super 的字段访问表达式或转换为超类类型来访问隐藏字段。

      http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html中查看更多信息

    • 示例代码

      class A {
          static int field;
      }
      class B extends A {
          int field;
          void doSomething() {
              System.out.println(super.field); // From A
              System.out.println(field); // From B
          }
      }
      class Main {
          public static void main(String[] args) {
              B b = new B();
              System.out.println(b.field); // From B
              System.out.println(((A) b).field); // From A
              System.out.println(A.field); // From A
          }
      }
      

    【讨论】:

      【解决方案2】:

      static 成员永远不会被覆盖(当然也不会被非静态成员覆盖)。由于您应该像这样访问它们:ClassName.member,因此也无需担心隐藏它们。

      在您的情况下,您可以像这样访问Superclass 字段:Superclass.fieldSubclass 实例的字段如下:subclass.field。但是,如果您在Superclass 变量中有一个Subclass 实例,就像上面一样,则此代码:d.field 将访问Superclass 中定义的静态字段,在您的情况下为false

      但这不会改变Subclass 实例的值,它只是访问了“错误”的成员!您可以通过将d 中的实例放回Subclass 变量并再次读取field 来验证这一点。

      【讨论】:

      • 感谢 rolve 这真的很有帮助
      • 我想补充一下为什么会发生这种情况,因为我也必须搜索才能找到。在这里找到了答案:(xyzws.com/Javafaq/what-is-variable-hiding-and-shadowing/15)“因为 Java 中的变量名称是由引用类型解析的,而不是它们所引用的对象。”
      【解决方案3】:

      超类中布尔字段的值是什么? 子类中的布尔字段?

      超类中field变量的值将保持为假,而子类中field的值将保持为真。

      在上述分配之后,子类字段是否保持为 FALSE?

      没有。您不能覆盖 Java 中的静态变量。本质上发生的是子类中的定义隐藏了超类中声明的变量。

      有关很好的示例和说明,请参阅SO Question

      我还建议您自己尝试一下,看看会发生什么。

      【讨论】:

      • 感谢 Suresh 提供的示例,我将试一试
      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 2012-08-28
      • 2016-01-14
      • 2021-12-01
      • 2011-01-02
      • 1970-01-01
      • 2011-10-15
      相关资源
      最近更新 更多