猿问

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

这是代码,我以为结果会是“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);

    }


}


白猪掌柜的
浏览 126回答 3
3回答

临摹微笑

因为您没有在 main 函数中调用方法 a() 。只需在 B 类初始化后添加 ba() 即可。您将得到结果。谢谢快乐编码;)

泛舟湖上清波郎朗

我不确定,但我猜这里的原因是初始化实例变量时。子类的构造函数隐式调用超类的构造函数。我像这样重写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

这段代码运行良好,只要记住一条黄金法则:不要从构造函数中调用覆盖方法!初始化时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附言您的代码运行良好,但这是一次很好的工作面试。对于现实生活,最好避免这些情况。
随时随地看视频慕课网APP

相关分类

Java
我要回答