让我们说,例如VolksWagen extends Car
然后我们执行以下操作
Car abc = new VolksWagen();
这里到底发生了什么?
例如,如果VolksWagen()
有某些方法,abc
则不会有任何这些方法,因为,VolksWagen 是孩子,而 Car 是父母,所以父母不会从其孩子那里继承任何方法。但是,我想知道什么区别在于
Car abc = new VolksWagen();
和
Car def = new Car();
让我们说,例如VolksWagen extends Car
然后我们执行以下操作
Car abc = new VolksWagen();
这里到底发生了什么?
例如,如果VolksWagen()
有某些方法,abc
则不会有任何这些方法,因为,VolksWagen 是孩子,而 Car 是父母,所以父母不会从其孩子那里继承任何方法。但是,我想知道什么区别在于
Car abc = new VolksWagen();
和
Car def = new Car();
当您扩展 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;
即使将A存储在变量中,它Volkswagen
仍然是a。您可以转换为然后可以访问其方法。Volkswagen
Car
abc
VolksWagen
你不能投射def
到VolksWagen
.
通常,Car
它将是一个抽象基类,因此您将无法直接实例化它。好处是您可以处理Car
代码中的任何类型,并且只需调用drive()
例如而无需知道确切的类型。然后drive
,每个子类的方法可以做一些不同的事情(例如每英里消耗不同数量的汽油)。
另外,不要挂断您分配实例的类。这只是 Java 等静态类型语言如何工作的产物。更容易想到:
var car = new Volkswagon();
var car2 = new Honda();
car.drive();
car2.drive();
performOilChange(car);
performOilChange(car2);
当您说 Parent a = new Child() 时,它就是一个孩子。当你说 Parent a = new Parent() 你不能使用子类型,因为父不继承它们。如果你说 Child a = new Child() 那么你可以使用 parent 方法因为扩展。
我们可以谈论很多,但这里有一个主要区别:
Car abc = new VolksWagen();
您可以访问 Car 的所有方法,但是如果方法被覆盖,VolksWagen
它们就会被调用。
和
Car def = new Car();
只有方法Car
被调用。
干杯!!