当一个类存储在不同的引用变量中时到底发生了什么?

时间:2013-09-17 19:03:26

标签: java inheritance

让我们说例如VolksWagen extends Car

然后我们执行以下操作

Car abc = new VolksWagen();

这里到底发生了什么?

如果例如VolksWagen()有某些方法,abc将不会有任何这些方法,因为,好吧,VolksWagen是孩子而Car是父,所以父母不继承任何方法从它的孩子..但是,我想知道

之间的区别

Car abc = new VolksWagen();

Car def = new Car();

5 个答案:

答案 0 :(得分:2)

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

由于WolksVagen 至少 Car中的方法,因此可以将它分配给Car类型的变量,因为调用Car类的任何方法也可以在VolksWagen对象上运行。

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

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

值得注意的是,此任务没有“丢失”任何方法,但使用变量c无法访问它们。您可以使用VolksWagen v = (VolksWagen)c;

随时将其强制转换回VolksWagen对象

答案 1 :(得分:0)

即使您将Volkswagen存储在Volkswagen变量中,Car仍然是abc。 您可以将VolksWagen转换为def,然后可以访问其方法。

您无法将VolksWagen投射到{{1}}。

答案 2 :(得分:0)

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

此外,不要挂断您为其分配实例的类。这只是像Java一样的静态类型语言的工件。想想更容易:

var car = new Volkswagon();
var car2 = new Honda();
car.drive();
car2.drive();
performOilChange(car);
performOilChange(car2);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我们可以谈论这个问题,但这是主要区别:

Car abc = new VolksWagen();

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

Car def = new Car();

仅调用Car的方法。

干杯!!