继承子Sub类

时间:2014-11-04 15:43:13

标签: java inheritance

我正在处理一个赋值有一个关于子类继承的问题,实际上是一个子类的子类的问题。我有三个类,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时,程序可以工作,但是,似乎不能在两者之间成为一个类。如果有人能够解释这将是伟大的。

6 个答案:

答案 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)

您的父母需要适当的构造函数。因为对象创建结构是从子类构造函数开始的,然后是超级,然后是超级。所以你应该维护构造函数结构