我有一个带有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*/ }
答案 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");
}
}
但你不能提供构造函数。