3

所以我在包 A 中有一个名为 Vehicle 的类,在包 B 中有一个名为 Car 的类。 Car 类扩展了 Vehicle,因此它从 Vehicle 继承了某些元素。我的问题是 Car 继承了什么?

我认为它继承了所有公共方法和变量,但是在我的分配中,我有具有包访问权限的变量(不是公共的,不是私有的),所以我必须从 Vehicle in Car 中重新声明所有变量,对吗?此外,不清楚的是我们是否可以使用 equals() 方法比较 Car 和 Vehicle 对象,因为即使它们具有相同的名称,变量也不相同。另外,即使我在构造函数 Car 中使用 super(),我为什么还要重新声明所有变量?变量不是在 Vehicle 中启动的吗?另外,既然我必须从 Vehicle 中重新声明所有变量,那么我从 Vehicle 继承的所有公共方法都完全没用吗?从只有包访问权变量的类继承有什么意义?

4

1 回答 1

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();

你会看到引擎启动了。

于 2013-02-09T15:59:51.353 回答