所以我有一个名为Vehicle的类在包A中,我在包B中有一个名为Car的类.Class Car扩展了Vehicle,因此它继承了Vehicle中的某些元素。我的问题是Car继承了什么?
我认为它继承了所有的公共方法和变量,但在我的任务中,我有变量包访问权限(不是公共的,不是私有的),所以我必须重新声明来自Vehicle in Car的所有变量,对吧?另外,不清楚的是我们是否可以使用equals()方法比较Car和Vehicle对象,因为即使它们具有相同的名称,变量也不相同。另外,即使我在构造函数Car中使用super(),我怎么还要重新声明所有变量?车辆中是否启动了变量?另外,既然我必须从Vehicle重新声明所有变量,那么我从Vehicle继承的所有公共方法都完全没用?从只有包访问权限变量的类继承有什么意义?
答案 0 :(得分:1)
你弄错了。它继承了Vehicle类中的所有内容。受子包保护的元素不能从子类访问,这就是全部。因此,您无法访问这些字段和方法,也无法覆盖它们。但这并不意味着你需要重新宣布它们。
我们举一个例子。假设您设计了一个Vehicle类,并允许子类覆盖并可以访问车辆的颜色。但是假设您不希望子类弄乱车辆的引擎。你会因此得到这样的东西:
public class Vehicle {
private Engine engine;
protected Color color = Color.BLACK;
public Vehicle() {
this.engine = new Engine();
}
public final void start() {
System.out.println("starting engine...");
engine.start();
System.out.println("engine started");
}
public final Color getColor() {
return this.color;
}
}
public class Car extends Vehicle {
public Car(Color color) {
super();
this.color = color;
}
}
汽车是一种车辆。因此,既然你可以开车,你也可以开车。并且由于车辆具有发动机,因此汽车也具有发动机。从Car类内部修改或对引擎做任何事情是不可能的,因为它对Vehicle类是私有的,但是汽车有一个。
但color
字段受到保护。这意味着Car类可以访问此字段。例如,它在构造函数中修改它,以便能够使用另一种颜色而不是黑色。
请尝试以下代码:
Car car = new Car();
car.start();
你会看到引擎启动了。