继承基类构造函数的子类,同时保持代码重用的原则

时间:2013-01-17 16:09:10

标签: java oop inheritance constructor hierarchy

所以这段代码有错误,因为基类有参数吗?因为每个子类的默认构造函数调用基类的默认构造函数?并且我们没有导致错误的基类的默认构造函数?

我是否误解了它,在实现代码重用原则的同时,最好的方法是什么,因为我正在尝试在OOP中练习编程

class A {
    int item;

    A(int item) {
        this.item = item;
    }
}

class B extends A {
    int subitem;

    B(int item) {
        super(item);
        subitem = item * 2;
    }
}

class C extends A {

}

2 个答案:

答案 0 :(得分:2)

首先,关于这个问题的标题:

  

继承基类构造函数的子类,同时保持代码重用原则

构造函数从不继承。它不会发生。你所展示的是不是继承 - 只要求任何构造函数(java.lang.Object中的构造函数除外)必须 链到另一个构造函数在同一个类中,链到超类中的构造函数。

  

所以这段代码有错误,因为基类有参数吗?

嗯,确切地说,这是因为基类没有无参数构造函数。

  

因为每个子类的默认构造函数都调用基类的默认构造函数?

仅当您未明确指定任何构造函数时,才提供默认构造函数。默认构造函数总是隐式调用基类中的无参数构造函数。

  

我们没有导致错误的基类的默认构造函数?

我们没有基类的无参数构造函数。基本上它等同于写作:

class C extends A {
    C() {
        super();
    }
}

如果您理解为什么 无法编译,您就会明白为什么没有任何显式声明的构造函数的版本不会编译,因为它们是等效的。

  

我是否误解了它,以及围绕这个

的最佳方式

围绕什么?如果不提供A,则无法创建item的实例。如果它编译会很糟糕 - item会是什么? C的每个实例也可以被视为A,这需要item ...

您可以编写一个无参数构造函数,它为超类构造函数提供某种默认值:

public C() {
    super("default item");
}

如果这就是你想要的。但除此之外,如果不知道你想要实现什么,我们就无法真正提出替代方案。

请注意,继承远非实现代码重用的唯一方法 - 事实上,我个人更喜欢通过组合而不是继承来重用。继承是强大的,但过度使用IMO。

答案 1 :(得分:0)

你的类C扩展A,它必须满足在构造函数中显式调用其one-arg构造函数的契约,或者你可以简单地在你的中定义一个no-args默认构造函数A类如:

class A {
    int item;

    A(int item) {
        this.item = item;
    }
    A(){
     //default stuff
     }
}