Inheritance 创建子类的构造函数

Inheritance 创建子类的构造函数,inheritance,Inheritance,当我为sundae类创建构造函数时,eclipse说我必须显式调用另一个构造函数,但我不知道如何修复它。 在我的主要方法中,当我创建一个Cake类型的新对象时,eclipse说没有可以访问的甜点咖啡馆类型的封闭实例,但是当我创建第二个对象时,它工作了。如果圣代扩展了冰淇淋(一个可疑的模型,但我离题了),那么创建圣代就必须先创建冰淇淋;您已经显式地给了一个构造函数一个参数(cost)。因此,您必须告诉圣代Sundae构造器传递给IceCream构造器的内容 这就是super关键字的作用 publi

当我为sundae类创建构造函数时,eclipse说我必须显式调用另一个构造函数,但我不知道如何修复它。
在我的主要方法中,当我创建一个Cake类型的新对象时,eclipse说没有可以访问的甜点咖啡馆类型的封闭实例,但是当我创建第二个对象时,它工作了。如果
圣代
扩展了
冰淇淋
(一个可疑的模型,但我离题了),那么创建
圣代
就必须先创建
冰淇淋
;您已经显式地给了一个构造函数一个参数(
cost
)。因此,您必须告诉圣代
Sundae
构造器传递给
IceCream
构造器的内容

这就是
super
关键字的作用

public Sundae( int topping ) {
    super( 5 ); // <- what's the cost?  5 bucks?
    // ...
}
当您刚开始使用Java时,最好包含所有可选内容。尽管在类构造函数中调用
super
是可选的,但如果不调用,编译器将注入一个

super();
它调用基类的0-arg构造函数。尽管在Java中包含构造函数是可选的,但如果未在基类中指定任何构造函数,编译器将插入如下所示的构造函数:

public BaseClass() {
    super();
}
此外,如果您在基类中指定了一个具有参数的构造函数,那么编译器不会创建隐式0-arg构造函数。这使得在没有参数的情况下调用
super()
的任何尝试都是错误的,例如编译器生成的上述调用


关于您的
Cake
问题,您已经在类中声明了一个类,而没有使嵌套类
成为静态类。这意味着您不能在没有封闭类实例的情况下实例化它。第一次在Java中启动时,应该声明所有嵌套类
static

是的,在子类中执行任何操作之前,需要调用正在子类化的父类的构造函数

假设您的父类如下所示:

package my.icecream.shop;

abstract public class IceCream {

    protected String mFlavour;

    public IceCream(String flavor) {
        mFlavour = flavour;
    }

    abstract public void serve();
}
您将其子类化为圣代,如下所示:

package my.icecream.shop;

public class Sundae extends IceCream {

    protected int mServes;

    public Sundae(String flavour, int serves) {
        // this super call is important and must come first to anything
        super(flavour);
        mServes = serves;
    }
}

当我创建一个新的Cake类型的对象时,我如何修复它,我不明白为什么它是一个错误我不能帮助
Cake
,如果看不到
Cake
甜点
的来源。我在我的问题中添加了Cake和甜点的代码,你能看看我添加到我的答案中的代码吗。
package my.icecream.shop;

public class Sundae extends IceCream {

    protected int mServes;

    public Sundae(String flavour, int serves) {
        // this super call is important and must come first to anything
        super(flavour);
        mServes = serves;
    }
}