这里是代码,我以为结果将是“ B”,导致方法“ a()”被覆盖,但是结果是“ null”,我不明白为什么。有人可以解释一下吗?非常感谢
public class HelloWorld {
public static void main(String[] args) {
B b = new B();
}
}
class A{
private String name = "A"; // "public" will have the same outcome
public A()
{
a();
}
public void a(){
System.out.println(name);
}
}
class B extends A{
private String name = "B";
public void a()
{
System.out.println(name);
}
}
答案 0 :(得分:2)
因为您没有在主函数中调用方法a()。
只需在类B初始化后添加b.a()。 这样您就会得到结果。
感谢Happy编码;)
答案 1 :(得分:0)
我不确定,但是我想原因是实例变量初始化时。
子类的构造函数隐式调用超类的构造函数。我这样重写B类的构造函数,以使事情更清楚:
public void B()
{
super();
System.out.println(name);
}
执行super()
语句,代码流跳转到类A的构造函数。由于多态性,在类A的构造函数中执行a()
语句将跳转到类B的方法a()
。目前,类B的变量name
尚未初始化,因此它输出null(String变量的默认值)。
完成super()
语句后,现在初始化变量name
。据我所知,实例变量将在调用super()
之后分配值。然后在下一个println
语句中,打印我们分配给name
的字符串。
您的源代码没有println
语句,因此仅显示null
。
答案 2 :(得分:0)
您未在此处调用重写的方法。这就是为什么它不打印“ B”的原因。您会得到“ null”作为答案,因为当时两个名称对象都被隐藏了,因为您已经为两个类创建了具有相同标识符的对象。
答案 3 :(得分:0)
此代码可以正常工作,只需记住一个黄金法则:不要从构造函数中调用覆盖方法!
A
初始化时会调用A.a()
,其中a()
在子类B
中被覆盖,但是该类尚未初始化,因此所有参数都有其默认值。
最好通过两个电话将其拆分;
B b = new B(); // init all classes completely to avoid unobvious states
b.a(); // do what you want
PS
您的代码可以正常工作,但这是一次很好的面试或工作面试。对于现实生活,最好避免这些情况。