在构造器中调用this(s)或super(s)

发布于 2022-09-05 07:35:00 字数 736 浏览 35 评论 0

问题描述见stackoverflow:
stackoverflow:Cannot reference “X” before supertype constructor has been called, where x is a final variable
看完stackoverflow上的解答后我反而更迷惑了(也有可能有是英语不过关的原因。。。)。因为我知道对象字段加载先于构造器,构造器创建时字段已经存在,那为什么会出现调用错误呢?
链接中得票最高的解答有这么一句:

when an object of type Test is created, a unique instance of defaultValue is also created and attached to that particular object. Because of this, it is not possible to ....

这段话意思是说当对象加载时,字段实例也被加载,就因为这个原因,所以错误。????这话说的好迷,就算这个非常'unique'的字段被加载进了非常'particular'的对象中,那构造器也是后一步才加载的事啊,怎么就能得出错误原因了呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一抹苦笑 2022-09-12 07:35:00
public class Test {

    private final int defaultValue = 10;
    private int var;

    public Test() {
        this(defaultValue);    // <-- Compiler error: cannot reference defaultValue before supertype constructor has been called.
    }

    public Test(int i) {
        var = i;
    }
}

这里 defaultValue 是类的实例 变量,在类实例创建后才会被创建,而类的创建是通过构造函数创建的,当一个构造函数 A 调用另一个构造函数 B 的时候(A、B参数不同),B 必须在 A 的第一行说明它会替代 A 的功能,所以 B 没执行的时候 其实 实例 还没有初始化,类实例还没创建,当然不能使用实例变量。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文