0

我正在研究与继承相关的Java章节,我有几个问题。

我对继承的工作原理有基本的了解(覆盖方法、信息隐藏、如何在子类中使用超类的私有字段等),但我只有一个问题,希望你能帮助我。

当超类有非默认构造函数 - 没有参数时,这意味着在子类中我必须创建新的构造函数(它可以是默认的 - 没有参数),但在第一条语句中必须是超类构造函数调用

好的,到目前为止一切顺利。到目前为止我明白了。在子类中,您必须调用超类构造函数,匹配任何构造函数参数。

但是让我们检查以下代码:(超类)

public class Vehicle {

    private int numOfWheels;
    private double avgGallonsPerMile;   

    public Vehicle(int numOfWheels, double avgGallonsPerMile) {

        this.numOfWheels = numOfWheels;
        this.avgGallonsPerMile = avgGallonsPerMile;
    }
}

还有另一个子类代码:

public class Car extends Vehicle{

    public Car(double avgGallonsPerMile) {
        super(What should i write here?, avgGallonsPerMile);

        //force numOfWheels to 4;

    }   
}

这是子类的练习:

每个子类都包含一个构造函数,该构造函数接受英里/加仑值作为参数,并将车轮数强制为适当的值——摩托车为 2,汽车为 4。

在子类构造函数中,我不需要numOfWheels 字段,因为无论如何我都会将其强制为 4(对于汽车)和 2(对于摩托车)。

但是我仍然需要超类的数据。从哪里获取这些数据?什么应该作为调用超类构造函数的第一个参数。

但这仍然不是孤例。我有很多练习,我不需要子类构造函数中的某些数据作为参数,但我仍然需要它们在超类构造函数调用中。

在这种情况下我该怎么办?

我真的希望你能理解我,我想说什么。这有点困难。

4

3 回答 3

2

如果它无论如何都是相同的 4 用于汽车和 2 用于摩托车而不是修复!

super(4, avgGallonsPerMile);

或更好的方法 - 声明一个常量:

private static final int NUM_OF_WHEELS = 4;
..
super(Car.NUM_OF_WHEELS, avgGallonsPerMile);
于 2012-09-25T14:21:45.530 回答
2

如果您不需要超类中的字段,那么很可能它不应该存在。相反,您可以执行以下操作。

public abstract class Vehicle {
    private final double avgGallonsPerMile;

    public Vehicle(double avgGallonsPerMile) {
       this.avgGallonsPerMile = avgGallonsPerMile;
    }
    public double getAvgGallonsPerMile() { return avgGallonsPerMile; }
    public abstract int getNumOfWheels();
}

public class Car extends Vehicle{
    public Car(double avgGallonsPerMile) {
       super(avgGallonsPerMile);
    }
    public int getNumOfWheels() { return 4; }
}

public class Bicycle extends Vehicle{
    public Bicycle (double avgGallonsPerMile) {
       super(avgGallonsPerMile);
    }
    public int getNumOfWheels() { return 2; }
}

public class Tricycle extends Vehicle{
    public Tricycle (double avgGallonsPerMile) {
       super(avgGallonsPerMile);
    }
    public int getNumOfWheels() { return 3; }
}

顺便说一句:如果你的汽车每英里使用加仑燃料,它一定是非常低效的。

于 2012-09-25T14:22:37.300 回答
1

非常简单:如果 a 上的轮子数Car始终为 4,则它们只需传递值 4:

public Car(double avgGallonsPerMile) {
   super(4, avgGallonsPerMile);

    // ...
}
于 2012-09-25T14:17:36.413 回答