我是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}}?我知道子类不能从超类继承实例变量。为什么他不使用保护?
答案 0 :(得分:3)
你完全正确!该代码无法编译。
如果不知道这些变量和类的目的,很难说。
答案 1 :(得分:2)
你是对的,因为这个原因它不能编译。
如果超类中有这样的构造函数,您可能只会省略对super的无参数调用,在这种情况下会自动推断出它。
关于原因的猜测:作者希望展示其他东西(如评论中所述),也许首先有一个有效的解决方案但后来决定,vtype代码过多地放大了示例并将其删除,而不再进行测试。
到Q.2,为什么他将超类中的type和vehicleName设为私有?
我会说,你继承实例变量,私有与否,你只是没有直接访问它们。
为什么他不使用保护呢?
我们无法分辨。由于它只是演示代码,并且私有成员未被使用且无法通过getter或setter访问,我们无法分辨。也许它是一个后来扩展的例子,然后它们被使用了?