当我为sundae类创建构造函数时,eclipse说我必须明确调用另一个构造函数,但我不明白如何解决它。 在我的main方法中,当我创建一个Cake eclipse类型的新对象时,没有可以访问DessertCafe类型的封闭实例,但是当我创建第二个时,它可以工作。任何人都可以帮我修理它们
答案 0 :(得分:0)
如果Sundae
扩展IceCream
(一个可疑的模型,但我离题),那么隐式创建Sundae
必须首先创建IceCream
;并且你明确地给了一个带参数的构造函数(cost
)。因此,您必须告诉Sundae
构造函数要传递给IceCream
构造函数的内容。
这是super
关键字的作用。
public Sundae( int topping ) {
super( 5 ); // <- what's the cost? 5 bucks?
// ...
}
通常,如果使用未知的构造函数参数扩展类,则必须使新构造函数也具有该参数:
public Sundae( int topping, int cost ) {
super( cost );
// ...
}
当您刚开始使用Java时,最好包含所有可选内容。虽然在您的类构造函数中调用super
是可选的,但如果您不放置一个,则编译器会注入一个类似于
super();
调用基类的0-arg构造函数。尽管在Java中包含构造函数是可选的,但是如果你在 not 中指定了基类中的任何构造函数,那么编译器会插入一个如下所示:
public BaseClass() {
super();
}
此外,如果你 在基类中指定了一个带有参数的构造函数,那么编译器会不创建一个隐式的0-arg构造函数。这使得任何尝试不带参数调用super()
,例如上面提到的编译器生成的这样的调用都是错误的。
关于您的Cake
问题,您已在类中声明了一个类,而没有创建嵌套类static
。这意味着您可以在没有封闭类实例的情况下实例化它。首次使用Java时,应该声明所有嵌套类static
。
答案 1 :(得分:0)
是的,在子类中执行任何操作之前,需要调用子类的父类的构造函数。
假设你的父类如下:
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;
}
}