首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java的子类构造函数错误中调用超类构造器和子类的重载构造函数

在java的子类构造函数错误中调用超类构造器和子类的重载构造函数
EN

Stack Overflow用户
提问于 2022-03-12 03:08:55
回答 1查看 88关注 0票数 0

我不能调用超类构造函数,也不能调用另一个重载的构造函数,因此,没有硬编码就可以初始化这两个类的数据了吗?

我知道我只能在构造函数中调用一个构造函数--子类或超类构造函数--这应该是构造函数体中的第一个语句,但是是否有更好的方法来初始化数据而不编写冗余代码?

如果没有办法这样做,这是否意味着我应该调用超类构造函数(以便能够初始化其私有数据),然后显式地初始化子类的数据?

提前谢谢!

代码语言:javascript
复制
private double side1;
private double side2; 
private double side3; 

public Triangle(){
    this.side1 = 1;
    this.side2 = 1;
    this.side3 = 1; 
}
public Triangle(double side1, double side2, double side3, String color, boolean filled) {
    this(side1, side2, side3);
    this(color,filled); //error
}
public Triangle(String color, boolean filled) {
    super(color,filled); //
}
public Triangle(double side1, double side2, double side3){
    setSide1(side1);
    setSide2(side2);
    setSide3(side3);
}[enter image description here][1]
EN

回答 1

Stack Overflow用户

发布于 2022-03-12 03:21:19

您只能在每个声明的构造函数中调用super()this()一次,最终将调用super()。如果要调用构造函数重载(this()),那么它调用的构造函数必然要调用this() (另一个构造函数)或super() (最终构造对象)。

尽管如此,对于您的用例,简化可以是:

代码语言:javascript
复制
public static final double DEFAULT_SIDE_LENGTH = 1;
public static final String DEFAULT_COLOR = "Red";
public static final boolean DEFAULT_FILLED = true;

public Triangle() {
    this(DEFAULT_SIDE_LENGTH, DEFAULT_SIDE_LENGTH, DEFAULT_SIDE_LENGTH);
}

public Triangle(String color, boolean filled) {
    this(DEFAULT_SIDE_LENGTH, DEFAULT_SIDE_LENGTH, DEFAULT_SIDE_LENGTH, color, filled);
}

public Triangle(double side1, double side2, double side3){
    this(side1, side2, side3, DEFAULT_COLOR, DEFAULT_FILLED);
}

public Triangle(double side1, double side2, double side3, String color, boolean filled) {
    super(/* arguments */);
    //assign sides, color, filled to their fields
}

本质上,您将需要一个构造函数,它接受所有相关信息(直接作为参数,或者作为数据对象)。从这里开始,就需要正确地为您缺少的参数提供缺省值。在相当多的情况下,您将能够以每个构造函数可以指定默认值的方式重载构造函数,除非您有两个不相交的参数集:

代码语言:javascript
复制
public Example() {
    this("default-for-one");
}

public Example(String one) {
    this(one, "default-for-two");
}

public Example(String one, String two) {
    super(); //call the parent constructor if we have one
    //assign fields
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71446662

复制
相关文章

相似问题

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