让我们说例如VolksWagen extends Car
然后我们执行以下操作
Car abc = new VolksWagen();
这里到底发生了什么?
如果例如VolksWagen()
有某些方法,abc
将不会有任何这些方法,因为,好吧,VolksWagen是孩子而Car是父,所以父母不继承任何方法从它的孩子..但是,我想知道
Car abc = new VolksWagen();
和
Car def = new Car();
答案 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;
答案 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
的方法。
干杯!!