这是代码,我以为结果会是“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); }}
3 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
我不确定,但我猜这里的原因是初始化实例变量时。
子类的构造函数隐式调用超类的构造函数。我像这样重写B类的构造函数以使事情更清楚:
public void B()
{
super();
System.out.println(name);
}
执行super()语句,代码流跳转到类A的构造函数。由于多态性,a()在类A的构造函数中执行语句会跳转到类B的方法。a()此时nameB 类的变量还没有初始化,所以它打印 null (字符串变量的默认值)。
完成super()语句后,现在变量name被初始化。据我所知,实例变量将在调用后赋值super()。然后在下println一条语句中打印我们分配给的字符串name。您的源代码没有println声明,所以它只有 print null。
阿晨1998
TA贡献2037条经验 获得超6个赞
这段代码运行良好,只要记住一条黄金法则:不要从构造函数中调用覆盖方法!
初始化时A
调用A.a()
where a()
is overridden in child class B
,但该类尚未初始化,因此所有参数都有其默认值。
最好将其拆分为两个调用;
B b = new B(); // init all classes completely to avoid unobvious states b.a(); // do what you want
附言
您的代码运行良好,但这是一次很好的工作面试。对于现实生活,最好避免这些情况。
添加回答
举报
0/150
提交
取消