为了账号安全,请及时绑定邮箱和手机立即绑定

继承,为什么打印结果为空?

继承,为什么打印结果为空?

白猪掌柜的 2022-03-10 10:50:36
这是代码,我以为结果会是“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贡献1982条经验 获得超2个赞

因为您没有在 main 函数中调用方法 a() 。

只需在 B 类初始化后添加 ba() 即可。您将得到结果。

谢谢快乐编码;)


查看完整回答
反对 回复 2022-03-10
?
泛舟湖上清波郎朗

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。


查看完整回答
反对 回复 2022-03-10
?
阿晨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

附言

您的代码运行良好,但这是一次很好的工作面试。对于现实生活,最好避免这些情况。


查看完整回答
反对 回复 2022-03-10
  • 3 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信