public class CircleGeometricObject extends GeometricObject {
private double radius;
public CircleGeometricObject() {}
public CircleGeometricObject(double radius) {
this. radius = radius;
}
public CircleGeometricObject(double radius, String color, boolean filled) {
this. radius = radius;
setColor(color);
setFilled( filled);
}
}
答案 0 :(得分:3)
如果你想减少代码重复,你可以做类似下面的事情(尽管添加一些空检查)。它可能在您的示例中位于顶部,但对于具有大量代码的构造函数,减少重复可能很有用。
public class MyClass {
private Double radius;
public MyClass() {
this(null, null, null);
}
public class MyClass(Double radius) {
this(radius, null, null)
}
public class MyClass(Double radius, String colour, boolean filled) {
this.radius = radius;
setColour(colour);
setFilled(filled);
}
}
**编辑将double更改为Double以允许null
答案 1 :(得分:1)
我不确定是否理解这个问题。你问为什么你必须覆盖 GeometricObject的构造函数?
以下代码编译不是强制性的:
public class CircleGeometricObject extends GeometricObject
{
private double radius;
public CircleGeometricObject(double radius, String color, boolean filled)
{
this.radius = radius;
setColor(color);
setFilled(filled);
}
}
您实现了所需的构造函数。
答案 2 :(得分:0)
不得不创建一个测试用例,因为它已经很长了,而且这总是一个模糊的区域:
public class ConstrTest {
protected String fieldA;
protected String fieldB;
public static void main(String[] argV) {
ConstrTestSub sub1 = new ConstrTestSub("111", "222");
sub1.print();
// ConstrTestSub sub2 = new ConstrTestSub();
// sub2.print();
}
public ConstrTest() {
this("ABC","XYZ");
}
public ConstrTest(String a) {
this(a, "YYY");
}
public ConstrTest(String a, String b) {
fieldA = a;
fieldB = b;
}
public void print() {
System.out.println("fieldA = " + fieldA + ", fieldB = " + fieldB);
}
}
class ConstrTestSub extends ConstrTest {
private String fieldC;
public ConstrTestSub(String a, String b) {
super(a, b);
fieldC = "QQQ";
}
public void print() {
System.out.println("fieldA = " + fieldA + ", fieldB = " + fieldB + ", fieldC = " + fieldC);
}
}
上面的代码编译并运行正常,并且ConstTestSub构造函数适当地执行相应的super
版本(即使没有明确的super
调用它也会这样做。)
如果取消注释main中的第二个new ConstTestSub
,它将无法编译,因为未定义构造函数的()
版本。
所以, 如果 你要完全定义你的构造函数, if 你需要多个表单,您必须定义所需的所有表单。 (当然,如果这足够的话,它们就可以级联。)