-1

让我们说,例如VolksWagen extends Car

然后我们执行以下操作

Car abc = new VolksWagen();

这里到底发生了什么?

例如,如果VolksWagen()有某些方法,abc则不会有任何这些方法,因为,VolksWagen 是孩子,而 Car 是父母,所以父母不会从其孩子那里继承任何方法。但是,我想知道什么区别在于

Car abc = new VolksWagen();

Car def = new Car();

4

5 回答 5

2

当您扩展 Car 时,您的全新类 VolksWagen 会继承其所有方法。这意味着它至少具有 Car 中定义的所有方法。

由于 WolksVagen至少具有Car 中的方法,因此认为可以将其分配给 Car 类型的变量,因为调用 Car 类的任何方法也适用于 VolksWagen 对象。

这允许您编写适用于任何汽车的其他方法,例如

void smash(Car car) {
   // ....
}
Car c = new VolksWagen();
smash(c); // Okay since c has all of Car's methods

值得注意的是,此分配不会“丢失”任何方法,但是无法使用变量访问它们c。您可以随时使用将其转换回 VolksWagen 对象VolksWagen v = (VolksWagen)c;

于 2013-09-17T19:06:18.183 回答
0

即使将A存储在变量中,它Volkswagen仍然是a。您可以转换为然后可以访问其方法。VolkswagenCarabcVolksWagen

你不能投射defVolksWagen.

于 2013-09-17T19:04:52.913 回答
0

通常,Car它将是一个抽象基类,因此您将无法直接实例化它。好处是您可以处理Car代码中的任何类型,并且只需调用drive()例如而无需知道确切的类型。然后drive,每个子类的方法可以做一些不同的事情(例如每英里消耗不同数量的汽油)。

另外,不要挂断您分配实例的类。这只是 Java 等静态类型语言如何工作的产物。更容易想到:

var car = new Volkswagon();
var car2 = new Honda();
car.drive();
car2.drive();
performOilChange(car);
performOilChange(car2);
于 2013-09-17T19:08:10.840 回答
0

当您说 Parent a = new Child() 时,它就是一个孩子。当你说 Parent a = new Parent() 你不能使用子类型,因为父不继承它们。如果你说 Child a = new Child() 那么你可以使用 parent 方法因为扩展。

于 2013-09-17T19:09:08.123 回答
0

我们可以谈论很多,但这里有一个主要区别:

Car abc = new VolksWagen();

您可以访问 Car 的所有方法,但是如果方法被覆盖,VolksWagen它们就会被调用。

Car def = new Car();

只有方法Car被调用。

干杯!!

于 2013-09-17T19:11:03.170 回答