1

我有一个带有 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*/ }
4

3 回答 3

3

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

如果你的父类声明了构造函数,子类就不能使用隐式构造函数,因为父类基本都表明“我不能被隐式实例化”,所以为了提供必要的信息,子类也必须至少声明一个显式构造函数。

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

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

于 2014-11-20T16:39:43.277 回答
2

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

好吧,严格来说,他们不必有那个构造函数——但他们需要有一个构造函数,以便将值传递给AbstractClass构造函数。

如果是这样,为什么?

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

想象一下,如果构造函数继承的——那么一切都会有一个无参数的构造函数,因为Object确实如此。所以你可以写:

FileInputStream stream = new FileInputStream();

……那是什么意思?

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

于 2014-11-20T16:40:15.557 回答
1

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

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

但是,您不能不提供构造函数。

于 2014-11-20T16:39:33.933 回答