2013-02-09 61 views
3

所以我有一个名为Vehicle的类,它位于包A中,而我的包B中有一个名为Car的类。Class Car扩展了Vehicle,因此它继承了某些元素车辆。我的问题是Car继承了什么?具有包访问权的交叉包继承(默认访问权)

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

回答

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

,你会看到发动机被启动。

+0

在我的程序中,没有使用访问修饰符(包访问权限),我没有使用受保护的,私有的或公共的。因此,我得到这个:错误:价格不公开在汽车;不能从外部包访问。 (第51行:this.price == other.price) – prog 2013-02-09 16:58:37

+0

此外,Class Car还在另一个包中。 – prog 2013-02-09 17:00:29

+0

@prog如果'engine'包是可见的而不是'private',这个答案仍然成立。同样,'Car'不能直接访问'engine',但仍然可以在'Vehicle'中声明的方法使用。 – 2013-02-09 20:46:15