这是代码,我认为结果将是“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);
}
}
4 回答
你没有在这里调用重写方法 . 这就是它不打印'B'的原因 . 您将获得'null'作为答案,因为当时两个名称对象都被隐藏,因为您已经为两个类创建了具有相同标识符的对象 .
因为你没有在main函数中调用方法a() .
只需在B类初始化后添加b.a()即可获得结果 .
谢谢快乐编码;)
这段代码工作正常,只记得一个 GOLDEN RULE: DO NOT CALL OVERRIDEN METHOD FROM CONSTRUCTOR!
当
A
初始化它调用A.a()
,其中a()
在子类B
中被覆盖,但此类尚未初始化,因此所有参数都具有其默认值 .用两个电话分开它会好得多;
P.S.
你的代码很好,但这是好的或面试 . 对于现实生活,避免这些情况要好得多 .
我不确定,但我猜这里的原因是初始化实例变量 .
子类的构造函数隐式调用超类的构造函数 . 所以我像这样重写B类的构造函数:
执行
super()
语句,代码流跳转到类A的构造函数 . 由于多态,在类A的构造函数中执行a()
语句将跳转到类B的方法a()
. 此时B类的变量name
尚未初始化,因此它打印为null(String变量的默认值) .完成
super()
语句后,现在变量name
被初始化 . 据我所知,实例变量将在调用super()
后赋值 . 然后在下一个a()
语句中,它打印我们分配给name
的字符串 .