我可以避免在子类中实现参数化构造函数

时间:2014-11-20 16:34:58

标签: java constructor abstract-class default-constructor concreteclass

我有一个带有1-param构造函数的抽象类,对于任何具体的子类都应该是相同的。每个具体的子类都必须具有相同的1-param构造函数,如果是,为什么?

摘要:

public abstract class AbstractClass {

public AbstractClass(String name){}

public AbstractClass getConcreteClass(){
    return (AbstractClass) new ConcreteClass("name");   //Does not work
}

}

混凝土:

public class ConcreteClass { /*Would like to have no constructor*/ }

3 个答案:

答案 0 :(得分:3)

每个类必须至少有一个构造函数。在没有显式构造函数的类中,存在没有任何参数且没有任何特殊初始化的隐式构造函数。

如果您的父类声明了构造函数,则子类不能使用隐式构造函数,因为父类基本上表示“我无法隐式实例化”,因此为了提供必要的信息,子类还必须声明至少一个显式构造函数

此外,构造函数的自动复制会违反抽象和信息隐藏,因为您的子类可能不情愿地将构造函数暴露给它不想公开的调用者。

当然你可以争辩说这应该是默认的,如果我不想暴露构造函数,我可以故意指出这一点。然而,Java决定走另一条路。类似的讨论是关于方法重写:我是否必须允许在我的父类中重写方法(例如,C#的virtual修饰符)或者我只是禁止它用于某些方法(Java的final改性剂)。

答案 1 :(得分:2)

  

每个具体的子类都必须具有相同的1-param构造函数

嗯,严格来说,他们不必拥有那个构造函数 - 但是他们需要有一个构造函数,以便将值传递给AbstractClass构造函数。 / p>

  

如果有,为什么?

因为构造函数不是继承的。子类所需的信息通常与超类所需的信息不同。

想象一下,如果构造函数继承的 - 那么所有都会有一个无参数构造函数,因为Object会这样做。所以你可以写:

FileInputStream stream = new FileInputStream();

......这意味着什么?

底线:将构造函数添加到子类中。每个子类只有三行......这应该不是问题。

答案 2 :(得分:1)

如果在子控制器中实例化预期参数,则可以使用nullary构造函数:

public class ConcreteClass extends AbstractClass {
    public ConcreteClass() {
        super("concrete");
    }
}

但你不能提供构造函数。