关于java的父类引用

来源:百度知道 编辑:UC知道 时间:2024/05/18 02:53:14
这是一道scjp的题目,请问父类引用为什么可以调用子类方法的?
11. abstract class Vehicle { public int speed() { return 0; } }
12. class Car extends Vehicle { public int speed() { return 60; } }
13. class RaceCar extends Car { public int speed() { return 150; }}
......
21. RaceCar racer = new RaceCar();
22. Car car = new RaceCar();
23. Vehicle vehicle = new RaceCar();
24. System.out.println(racer.speed() + “, ‘ + car.speed()
25. + “, “+ vehicle.speed());
What is the result?
A. 0, 0,0
B. 150, 60, 0
C. Compilation fails.
D. 150, 150, 150
E. An exception is thrown at runtime.
Answer: D

通俗来说
赛车也是车啊
就像Car car = new RaceCar();
这是一辆赛车 但不懂的人就以为这只是一辆车
车有速度speed()
这辆是赛车的车的speed自然是赛车的speed

从技术上来说
父类的引用指向的是子类的实例,因此共有行为的执行者其实仍然是子类

RaceCar racer = new RaceCar();
Car car = new RaceCar();
Vehicle vehicle = new RaceCar();

多态,注意他都是 赛车的 实例。

继承的原理,因为java是面向对象的语言,它是单线继承的,通俗的讲就是讲一个子类只能有一个父类,但是一个父类可以有多个子类,映射到现实,就好像一个父亲可以有多个儿子,而一个儿子只能有一个父亲,那么儿子可以使用父亲的东西,而父亲不能使用儿子的东西(现实比喻,不过好像真的是这样.....)

这就是著名的多态了,首先,该方法不是子类特有的方法,而是子类对父类方法的重写,第二点,记住这句话,父类引用指向子类对象,这就是动态绑定,如果我new的是Car 就调用Car 的speed方法,如果我new的是RaceCar 就调用RaceCar 的speed方法!!