首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >super.a =b而不是super(b)

super.a =b而不是super(b)
EN

Stack Overflow用户
提问于 2020-11-13 05:19:36
回答 2查看 53关注 0票数 2

我正在学习超级关键字,无意中得到了这个,下面是一个例子:

代码语言:javascript
复制
    public class A {
       double a;
       public A (double a) {
          this.a = a;
       }
    }
    public class B extends A {
       public B (double b) {
          super.a = b;  //***
       }
    }

与本教程中一样,通常的方法是通过super(b)重用其父构造函数,但是super.a = b的错误之处在于

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-13 05:32:54

当你像这样写A类的时候:

代码语言:javascript
复制
public class A {
    double a;
    public A(double a) {
        this.a = a;
    }
}

您覆盖了默认的构造函数,并在this.a = a行中访问实例变量并在类B中设置值:

代码语言:javascript
复制
public class B extends A {
    public B(double b) {
        super.a = b; // ***
    }
}

你正在尝试通过构造函数访问B类的实例变量,因为在这里的super.a中,超级引用了构造函数,它是错误的,并抛出了Implicit super constructor A() is undefined. Must explicitly invoke another constructor,这意味着:在B类中,它寻找一个没有参数的构造函数,因为你覆盖了类的默认构造函数,它无法通过调用super.a = b来识别它,所以你必须在第一行代码中将超级构造函数作为一个函数来调用:

代码语言:javascript
复制
public class B extends A {
    public B(double b) {
        super(b);
        super.a = b; // ***
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-11-13 05:23:36

Java中没有“构造函数继承”。如果超类没有无参数的构造函数,则必须显式调用它的构造函数(如果有多个构造函数,则调用其中的一个)。如果你不这样做,你会得到一个编译错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64811889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档