Parent No Argument构造函数调用重写方法

时间:2013-07-25 07:28:41

标签: java default subclass

确定是否存在类似问题或早先已经回答过。我做了搜索但找不到任何相关内容。

请参阅以下示例。有一个没有参数构造的A类。 B类扩展了A类,但不存在默认的构造函数。输出是B->得到c,我认为java使用运行时多态性逻辑来调用B对象方法。

这里想了解它是否正确以及Java如何在这里工作(也许是什么是基础逻辑)

由于

public class A {

    private String cStr="";
    private String dStr="";

    A()
    {
        getcStr();
    }

    public String getcStr() {
        System.out.println("A-> get c");
        return cStr;
    }

    public String getdStr() {
        System.out.println("A-> get d");
        getcStr();
        return dStr;
    }
}
public class B extends A{

    private String cStr;

    public String getcStr() {
        System.out.println("B-> get c");
        return cStr;
    }
}
public static void main (String[] args)
{
    A a= new B();
    a.getdStr();
}

编辑:a.getdStr()的输出是A->得到d B->得到c

2 个答案:

答案 0 :(得分:3)

如果一个类没有默认构造函数,在你的情况B中,则java将隐式插入一个无参数的构造函数

public B() {
   super();
}

要回答您的问题,是的,由于运行时多态性,Java调用了B的{​​{1}}方法。因为B的构造函数通过super()

调用A的构造函数

这是一个着名的反模式。它的反模式是因为你试图在完全构造getcStr()之前在B上调用覆盖方法

想象一下,你的B课程就像这样

B

现在,您的程序输出为public class B extends A{ private String cStr = "abc"; public String getcStr() { System.out.println(cStr); return cStr; } } 而不是null,因为"abc"尚未完全构建(这意味着B未初始化为{{1} }})

答案 1 :(得分:1)

B没有默认构造函数,因此它将调用A()构造函数.....

现在new B();创建B的对象,因此java将首先查看类B,这是任何类似getcstr()的过程,如果在那里发现过程,它将调用它,否则在超类中检查该过程......