你说错了。它继承了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();
,你会看到发动机被启动。
在我的程序中,没有使用访问修饰符(包访问权限),我没有使用受保护的,私有的或公共的。因此,我得到这个:错误:价格不公开在汽车;不能从外部包访问。 (第51行:this.price == other.price) – prog 2013-02-09 16:58:37
此外,Class Car还在另一个包中。 – prog 2013-02-09 17:00:29
@prog如果'engine'包是可见的而不是'private',这个答案仍然成立。同样,'Car'不能直接访问'engine',但仍然可以在'Vehicle'中声明的方法使用。 – 2013-02-09 20:46:15