静态字段重写在Java7中工作得很好

静态字段重写在Java7中工作得很好,java,static,overriding,Java,Static,Overriding,我试图理解Java中的静态变量,我看到的是以下行为 public class TestParent { protected static String name = "parent"; } public class TestChild extends TestParent{ public TestChild(){ super.name="child"; } } 现在如果 TestParent tp = new TestParent(); 输出:

我试图理解Java中的静态变量,我看到的是以下行为

public class TestParent {
     protected static String name = "parent";
}

public class TestChild extends TestParent{
    public TestChild(){
          super.name="child";
    }
}
现在如果

TestParent tp = new TestParent();
输出:

母公司

否则,

TestParent tp = new TestChild();
输出: 孩子

有人能给我解释一下到底发生了什么事吗?我知道这个问题听起来很简单,但我无法理解原因


谢谢。

静态字段永远不会附加到实例而不是类。他们只需要输入就可以访问

由于super引用了类型
TestParent
,看起来您正在重写它,但是您也可以从外部子级使用它的类名(
TestParent
)来完成

为了访问静态字段,您只需要类型,而不需要实例。前

TestParent test = null;
System.out.println(test.name);
这是因为测试的类型是
TestParent
它对该类型调用
name

更新您的问题更新:

当您执行
TestParent tp=newtestchild()时

您正在调用子类构造函数,并在该构造函数中执行

 super.name="child";
TestParent tp = new TestChild();
因此,这将
name
的值更改为
child


尽管您在子类中进行了更改,但由于静态变量绑定到父类而不是实例,您可以在所有实例中看到更改。

静态字段不会被继承,这意味着子类不会获得它们在父类中只存在一次的静态字段的副本

现在当你这样做的时候。 TestParent tp=新的TestParent()

它将打印父级
。因为值
parent
被分配给字段名,而您没有调用
newtestchild()尚未,这将更改值

所以当你在做

 super.name="child";
TestParent tp = new TestChild();
TestChild
构造函数中,
name
的值被更改为
child
。这里您正在更改类
TestParent
的变量,以及类
TestParent
name
变量中受影响的更改。这就是为什么打印时会得到
child

你可以再做一点实验。如果你这样做

TestParent tp = new TestChild();
首先打印(这将提供
子项
作为输出), 然后

TestParent tp = new TestParent();

并且打印它也会将
子项
作为输出。

超级名
是一个“谎言”。这就是为什么
((TestParent)null)
也可以。你能解释一下为什么((TestParent)null);是否可行?请参阅。可以在任何正确类型的表达式上访问静态字段;实际情况——或者说缺乏——与此无关。通常最好只使用“显然是静态的”形式(即,
TestParent.name
),以避免这样的混淆。@AlienOnEarth在我的回答中添加