我正在处理一个赋值有一个关于子类继承的问题,实际上是一个子类的子类的问题。我有三个类,Fruit(主类),Apple(水果的子类,也是抽象的),Macintosh(苹果的子类)。 Fruit包含一系列构造函数方法,Apple是抽象的并且包含一个方法,而MacIntosh包含对超类(Fruit)的构造函数调用。
Fruit.java
public abstract class Fruit extends Object {
// The name of the fruit
protected String mName;
// Number of calories
protected int mCalories;
// Color of the fruit
protected Color mColor;
// Weight of the fruit, in pounds
protected double mWeight;
protected Fruit() {
this("Apple");
// Default fruit
}
protected Fruit(String name) {
this(name, 0);
}
protected Fruit(String name, int calories) {
this(name, calories, null);
}
protected Fruit(String name, int calories, Color color) {
this(name, calories, color, 0d);
}
protected Fruit(String name, int calories, Color color, double weight) {
this.mName = name;
this.mCalories = calories;
this.mColor = color;
this.mWeight = weight;
}
Apple.java
abstract class Apple extends Fruit {
abstract void bite();
}
Macintosh.java
public class Macintosh extends Apple {
public Macintosh() {
super(Macintosh.class.getSimpleName(), 200, new Red(), 0.14d);
}
void bite() {
setWeight(getWeight() - 0.01d);
}
}
当我运行程序时,我收到以下错误:
super(Macintosh.class.getSimpleName(), 200, new Red(), 0.14d);
^
required: no arguments
found: String,int,Red,double
reason: actual and formal argument lists differ in length
1 error
我理解错误是什么,我只是混淆了为什么继承没有从Fruit传递到Apple到Macintosh。当我从Macintosh类扩展Fruit时,程序可以工作,但是,似乎不能在两者之间成为一个类。如果有人能够解释这将是伟大的。
答案 0 :(得分:3)
构造函数不是继承的,所以即使Apple扩展了Fruit,构建Apple的唯一方法是调用Apple提供的构造函数之一(在这种情况下是默认的无参数构造函数)。当您的Macintosh扩展Apple时,它必须使用Apple提供的构造函数。
对于您的代码,您必须至少向Apple提供以下构造函数
Apple(String name, int calories, Color color, double weight) {
super(name, calories, color, weight);
}
答案 1 :(得分:2)
在Apple中提供有效的构造函数:
abstract class Apple extends Fruit {
protected Apple (String name, int calories, Color color, double weight) {
super(name, calories, color, weight);
}
abstract void bite();
}
请注意,构造函数不是继承的。
答案 2 :(得分:1)
你用4个参数调用apple构造函数但是在apple类中你没有这个代码的构造函数:
super(Macintosh.class.getSimpleName(), 200, new Red(), 0.14d);
您需要使用以下四个参数定义apple构造函数:
Apple(String name, int calories, Color color, double weight) {
super(name, calories, color, weight);
}
答案 3 :(得分:1)
当你在Macintosh中说super时,它指的是没有构造函数的Apple。你应该在Apple中定义一个构造函数来调用它的超级构造函数,即Fruit的
答案 4 :(得分:0)
您需要使用正确的参数
为Apple
定义构造函数
答案 5 :(得分:0)
您的父母需要适当的构造函数。因为对象创建结构是从子类构造函数开始的,然后是超级,然后是超级。所以你应该维护构造函数结构