我在网上发现了这些问题(滑铁卢大学考试学习问题https://www.student.cs.uwaterloo.ca/~cs125/S08/Resources/Exams/StudyQuestions/W07ExamReview/inheritance_questions.txt),但是他们发布时没有任何答案,所以我只想知道我是否正确。
假设名为SportsCar的类是名为Automobile的类的子类。假设汽车类具有名为speed,manufacturer和numberOfCylinders的实例变量。 SportsCar类的对象是否有名为speed,manufacture和numberOfCylinders的实例变量?
假设名为SportsCar的类是名为Automobile的类的子类,并假设类Automobile具有名为accele和addGas的公共方法。 SportsCar类的对象是否有名为accele和addGas的方法?如果是这样,这些方法是否必须在类SportsCar中执行与在Automobile类中完全相同的操作?
是的,因为子类继承了所有的超类方法和 变量
类SportsCar会有方法addGas,但它不会执行 与“汽车”类中的方法“完全相同”的操作。
提前谢谢!
答案 0 :(得分:4)
一般不会,因为它没有指定评估修饰符,这意味着如果速度是私有的,那么SportCar将不具备该属性
SportCar的对象将具有addGas并将执行与Automobile类实例相同的操作,除非在SportCar中未覆盖公共方法addGas
答案 1 :(得分:0)
1)正确,除非实例变量是私有的
2)SportsCar可以覆盖该方法,因此 不会完全相同。 SportsCar甚至可以根据方法的参数数量和类型重载addGas以执行不同的操作。
答案 2 :(得分:0)
1。 这取决于实施。如果访问修饰符是私有的,则子类(SportsCar)将不会“访问”它们,但这并不意味着它们不存在。例如,SportsCar可以通过构造函数更改这些值,如下所示。
public class Automobile {
private int speed;
private int manufacture;
private int numberOfCylinders;
public Automobile(int speed, int manufacture, int numberOfCylinders) {
this.speed = speed;
this.manufacture = manufacture;
this.numberOfCylinders = numberOfCylinders;
}
}
虽然Sportscar不能直接访问它们,但它仍然可以根据汽车的实施情况修改值。
public class SportsCar extends Automobile {
public SportsCar() {
super(5, 10, 20);
}
}
2。 是的,它会覆盖它们。但这又取决于汽车中那些方法的访问修饰符。
public class Automobile {
public void addGas(){
//adding gas
}
}
public class SportsCar extends Automobile {
@Override
public void addGas() {
// Do Something else
}
}