java - Parent No Argument Constructor 调用覆盖的方法

标签 java default subclass

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

请看下面的例子。有一个没有参数构造函数的 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 调用了 BgetcStr() 方法。因为 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/

相关文章:

java - JFrame 不显示图片

java - 如何将Json请求中带unicode的值转换成简单字符?

mysql - 默认值在 phpmyadmin/mysql 数据库中不起作用

c++ - ComboBox 子类列表框

java - 将 nonfree 包含到 opencv4android

使用python脚本进行javan安装

java - 如何为 WildFly 服务器设置默认错误页面?

Cocoa API 设置文件打开的默认应用程序

Objective-C:实例变量不能放置在类别中

具有私有(private)构造函数的 Java 子类会产生编译错误