继承,为什么打印输出结果为null?

时间:2018-12-10 03:15:48

标签: java inheritance

这里是代码,我以为结果将是“ 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 个答案:

答案 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

您的代码可以正常工作,但这是一次很好的面试或工作面试。对于现实生活,最好避免这些情况。