【发布时间】: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