1

不确定是否存在类似的问题或之前已经回答过。我进行了搜索,但找不到任何相关内容。

请看下面的例子。有一个没有参数构造器的 A 类。B 类扩展 A 类,但不存在默认构造函数。输出是B->get 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-> get d B-> get c

4

2 回答 2

3

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

public B() {
   super();
}

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

这是一个著名的反模式。并且它的反模式,因为您试图在B之前调用覆盖的方法B是完全构造的

想象一下你的B课是这样的

public class B extends A{

    private String cStr = "abc";



    public String getcStr() {
        System.out.println(cStr);
        return cStr;
    }
}

现在您的程序的输出将是null,而不是"abc"因为B尚未完全构造(这意味着cStr未初始化为"abc"

于 2013-07-25T07:31:35.213 回答
1

B 没有默认构造函数,所以它会调用 A() 构造函数.....

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

于 2013-07-25T07:43:13.897 回答