我不能调用超类构造函数,也不能调用另一个重载的构造函数,因此,没有硬编码就可以初始化这两个类的数据了吗?
我知道我只能在构造函数中调用一个构造函数--子类或超类构造函数--这应该是构造函数体中的第一个语句,但是是否有更好的方法来初始化数据而不编写冗余代码?
如果没有办法这样做,这是否意味着我应该调用超类构造函数(以便能够初始化其私有数据),然后显式地初始化子类的数据?
提前谢谢!
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]发布于 2022-03-12 03:21:19
您只能在每个声明的构造函数中调用super()或this()一次,最终将调用super()。如果要调用构造函数重载(this()),那么它调用的构造函数必然要调用this() (另一个构造函数)或super() (最终构造对象)。
尽管如此,对于您的用例,简化可以是:
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
}本质上,您将需要一个构造函数,它接受所有相关信息(直接作为参数,或者作为数据对象)。从这里开始,就需要正确地为您缺少的参数提供缺省值。在相当多的情况下,您将能够以每个构造函数可以指定默认值的方式重载构造函数,除非您有两个不相交的参数集:
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
}https://stackoverflow.com/questions/71446662
复制相似问题