首页 文章

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

提问于
浏览
0

这是代码,我认为结果将是“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

    你没有在这里调用重写方法 . 这就是它不打印'B'的原因 . 您将获得'null'作为答案,因为当时两个名称对象都被隐藏,因为您已经为两个类创建了具有相同标识符的对象 .

  • 0

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

    只需在B类初始化后添加b.a()即可获得结果 .

    谢谢快乐编码;)

  • 0

    这段代码工作正常,只记得一个 GOLDEN RULE: DO NOT CALL OVERRIDEN METHOD FROM CONSTRUCTOR!

    A 初始化它调用 A.a() ,其中 a() 在子类 B 中被覆盖,但此类尚未初始化,因此所有参数都具有其默认值 .

    用两个电话分开它会好得多;

    B b = new B();  // init all classes completely to avoid unobvious states
    b.a();          // do what you want
    

    P.S.

    你的代码很好,但这是好的或面试 . 对于现实生活,避免这些情况要好得多 .

  • 2

    我不确定,但我猜这里的原因是初始化实例变量 .

    子类的构造函数隐式调用超类的构造函数 . 所以我像这样重写B类的构造函数:

    public void b()
        {
           super();
           System.out.println(name);
        }
    

    执行 super() 语句,代码流跳转到类A的构造函数 . 由于多态,在类A的构造函数中执行 a() 语句将跳转到类B的方法 a() . 此时B类的变量 name 尚未初始化,因此它打印为null(String变量的默认值) .

    完成 super() 语句后,现在变量 name 被初始化 . 据我所知,实例变量将在调用 super() 后赋值 . 然后在下一个 a() 语句中,它打印我们分配给 name 的字符串 .

相关问题