具有包访问权限的跨包继承(默认访问权限)

时间:2013-02-09 15:44:12

标签: java inheritance package

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

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

1 个答案:

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

你会看到引擎启动了。