我试图理解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();
输出: 子
有人可以向我解释究竟发生了什么吗?我知道这个问题听起来很简单,但我无法理解原因。
感谢。
答案 0 :(得分:1)
静态字段永远不会附加到实例而不是类。他们只需要访问类型。
由于对TestParent
类型的超级引用,看起来你覆盖了它,但你可以从外面的孩子那里做它,并且它的类名称(TestParent
)。
用于访问您只需要类型的静态字段,不需要实例。对于前
TestParent test = null;
System.out.println(test.name);
这是有效的,因为测试类型是TestParent
,它在该类型上调用name
。
Why does Java compiler allow static variable access through null object?
更新问题更新:
执行TestParent tp = new TestChild();
您正在调用子类构造函数,并且在该构造函数中正在执行
super.name="child";
因此,这会将name
的值更改为child
虽然您在更改子项,但由于静态变量绑定到Parent类而不是实例,您可以看到所有实例的更改。
答案 1 :(得分:0)
静态字段不会被继承,这意味着子类不会获得它们在父类中只存在一次的那些静态字段的副本。
现在当你这样做的时候。 TestParent tp = new TestParent();
它会打印parent
。因为值parent
已分配给字段名称,而您尚未调用new TestChild();
,这将更改该值。
所以当你做的时候
TestParent tp = new TestChild();
在TestChild
构造函数中,name
的值更改为child
。在这里,您要更改类TestParent
的变量以及类name
的{{1}}变量中受影响的更改。这就是您在打印时获得TestParent
的原因。
你可以多做一些实验。如果你这样做
child
首先打印(将TestParent tp = new TestChild();
作为输出),
然后
child
并打印它也会将TestParent tp = new TestParent();
作为输出。