为什么我们不能组合所有构造函数,为什么在典型的继承情况下必须有三个重载的构造函数?

时间:2013-04-19 20:22:25

标签: java inheritance

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);
    }
}

3 个答案:

答案 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 你需要多个表单,您必须定义所需的所有表单。 (当然,如果这足够的话,它们就可以级联。)