【问题标题】:Unexpected Behaviour of inherited static member继承的静态成员的意外行为
【发布时间】:2012-09-07 09:17:56
【问题描述】:

我只是在玩static 和继承,看看能做什么,不能做什么。我以前读过,静态方法不能被覆盖,它们可以简单地隐藏。这就是为什么我试图看看什么适用于静态成员。下面是一些简单的测试代码:

public class ParentClass {
    public static String x;
    { x = "In ParentClass"; }
}

public class ChildClass extends ParentClass {
    { x = "In ChildClass"; }
}

现在,当我打印从对象调用的 x 时,一切都按预期进行:

ParentClass parentClassReference = new ParentClass();
System.out.println(parentClassReference.x); // prints: "In ParentClass"

parentClassReference = new ChildClass();
System.out.println(parentClassReference.x); // prints: "In ChildClass"

即使是从子类对象对 x 的微不足道的调用:

ChildClass childClassReference = new ChildClass();
System.out.println(childClassReference.x); // prints: "In ChildClass"

现在,当我调用静态成员时,就像它应该完成的那样,它变得很奇怪:

System.out.println(ChildClass.x); // prints: "In ChildClass" (Ok, so far.)
System.out.println(ParentClass.x); // prints: "In ChildClass" (This is unexpected.)

我对这种行为没有任何解释。在Overriding vs. Hiding (Code Ranch) 的上下文中,似乎更有可能通过对象的调用不应该按预期工作,但通过类名的调用应该。

我很困惑。谁能帮忙?

【问题讨论】:

    标签: java inheritance static overriding hide


    【解决方案1】:

    您的代码非常很奇怪...但结果完全符合我的预期。

    你需要明白三件事:

    • 这里只有 一个 x 变量。无论您将其引用为ChildClass.x 还是ParentClass.x,它都是同一个变量
    • 当您通过引用引用静态成员时,编译器只是将其转换为静态引用,根本不查看引用的值。所以childClassReference.x等价于ChildClass.x,实际上编译为ParentClass.x。好的 IDE 会警告您这类事情 - 它会产生令人困惑的代码。
    • 您编写的设置x 值的代码仅基于构造函数调用执行。基本上相当于:

      public class ParentClass {
          public static String x;
          public ParentClass() {
              x = "In ParentClass";
          }
      }
      
      public class ChildClass extends ParentClass {
          public ChildClass() {
              x = "In ChildClass";
          }
      }
      

    从根本上说,您不应该尝试通过静态成员来实现任何类型的多态性。它不起作用,并且试图伪造它不会愉快地结束。

    【讨论】:

    • 好的,现在我看穿了我的想法。实际上,我的 IDE 确实警告过我,但正如我所说:我正在四处看看会发生什么。
    • +1 恕我直言,在构造函数(或初始化块)中设置静态字段绝不是一个好主意
    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2010-10-06
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多