关于构造扩展抽象类构造函数而没有super()的子类的问题

时间:2018-04-02 01:00:54

标签: java oop inheritance

我是Java OOP的新手,并且一直在研究这种阅读GitBook的Java计算机科学 我发现此页面非常混乱:https://codehs.gitbooks.io/apjava/content/Classes-And-Object-Oriented-Programming/class-design-and-abstract-classes.html

代码就像这样

public abstract class VehicleClass {
    private String type;
    private String vehicleName;

    public VehicleClass(String vType, String vName) {
        type = vType;
        vehicleName = vName;
    }

    /* This will need to be abstract, since 
     * we will need to implement different formulas
     * depending on if the vehicle is electric or 
     * gas powered.
     */ 
    public abstract double getMileage();
}

/* As you can see, in both classes, we have `getMileage` implemented
 * with different formulas.
 */ 
public class Truck extends VehicleClass {
    private double gasTankCapacity;
    private double milesPerTank;

    public Truck(double capacity, double miles) {
        gasTankCapacity = capacity;
        milesPerTank = miles;
    }

    public double getMileage() {
        return milesPerTank/gasTankCapacity;
    }
}

public class ElectricCar extends VehicleClass {
    private double maxCharge;
    private double milesPerCharge;
    private double maxEnergyUsage;

    public ElectricCar(double charge, double maxEnergy, double milesCharge) {
        maxCharge = charge;
        maxEnergyUsage = maxEnergy;
        milesPerCharge = milesCharge;
    }

    public double getMileage() {
        return (maxCharge*milesPerCharge)/maxEnergyUsage;
    }
}

我的问题是: 1.为什么他在不使用super()的情况下构建两个子类的构造函数。他不需要将类型和vehicleName传递给超类的构造函数吗? 2.为什么他在超类中vehicleName的类型和private是{{1}}?我知道子类不能从超类继承实例变量。为什么他不使用保护?

2 个答案:

答案 0 :(得分:3)

  1. 你完全正确!该代码无法编译。

  2. 如果不知道这些变量和类的目的,很难说。

答案 1 :(得分:2)

你是对的,因为这个原因它不能编译。

如果超类中有这样的构造函数,您可能只会省略对super的无参数调用,在这种情况下会自动推断出它。

关于原因的猜测:作者希望展示其他东西(如评论中所述),也许首先有一个有效的解决方案但后来决定,vtype代码过多地放大了示例并将其删除,而不再进行测试。

到Q.2,为什么他将超类中的type和vehicleName设为私有?

我会说,你继承实例变量,私有与否,你只是没有直接访问它们。

  

为什么他不使用保护呢?

我们无法分辨。由于它只是演示代码,并且私有成员未被使用且无法通过getter或setter访问,我们无法分辨。也许它是一个后来扩展的例子,然后它们被使用了?