不确定是否存在类似问题或之前是否已回答。我进行了搜索,但找不到任何相关内容。
请看下面的例子。有一个没有参数构造函数的 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
最佳答案
如果一个类没有默认构造函数,在你的例子中是 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"
)
关于java - Parent No Argument Constructor 调用覆盖的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17851651/