静态字段重写在Java7中工作得很好
我试图理解Java中的静态变量,我看到的是以下行为静态字段重写在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(); 输出:
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在我的回答中添加