黑马程序员技术交流社区
标题: 多态问题 [打印本页]
作者: 左耳的鱼 时间: 2013-7-17 07:07
标题: 多态问题
本帖最后由 左耳的鱼 于 2013-7-21 17:54 编辑
class Vehicle {
public void drive() {
System.out.println("Vehicle: drive");
}
}
class Car extends Vehicle {
public void drive() {
System.out.println("Car: drive");
}
}
public class Test {
public static void main (String args []) {
Vehicle v;
Car c;
v = new Vehicle();
c = new Car();
v.drive();
c.drive();
v = c;
v.drive();
}
}//
Vehicle: drive
Car: drive
Car: drive
为什么是这个结果
作者: 王靖远 时间: 2013-7-17 08:52
前两个不必说。第三个就是多态。父类引用指向子类对象。方法能不能调用看左边父类有没有该方法,具体如何实现看子类有没有覆盖该方法,覆盖了的话就按子类的方法实现
作者: a767175432 时间: 2013-7-17 09:05
第三个属于多态了
你可以这样看:v = c;v=.drive(); 因为继承的关系两个对象引用才能相互赋值,第一句就是v和c指向同一个地址,指向了c的对象所在的内存当中,调用的当然也是C当中的方法了。
作者: 张俊生 时间: 2013-7-17 09:30
- class Vehicle
- //父类
- {
- public void drive() {
- System.out.println("Vehicle: drive");
- }
- }
- class Car extends Vehicle
- //子类继承父类
- {
- public void drive() {
- System.out.println("Car: drive");
- }
- }
- public class Test {
- public static void main (String args []) {
- Vehicle v;
- Car c;
- v = new Vehicle();//建立子类对象
- c = new Car(); //建立父类对象
- v.drive();
- c.drive();
- v = c;//这里是个多态
- v.drive();//所以这里的v.drive直接调用子类的c.drive
-
- }
- }
- /*
- Vehicle: drive
- Car: drive
- Car: drive
- 这是个人的理解,不知是否正确
- */
复制代码
作者: 在乎.. 时间: 2013-7-17 10:53
v = c;
v.drive();
既然你说到了多态问题,这个有个简单总结的:编译时候看左边(即v),运行时看右边(c)
1.编译-- 假设你v=c 的时候,v 没有drive()这方法,而在c 有drive(),则会报错,为什么呢?因为编译时v根本就没有drive()方法。
2. 运行-- 编译通过后 ,即v有drive()方法,根据运行时看右边(c),既然c 复写父类的drive()方法,实际上是调用 c.drive()吧。。偶是这样理解的,请采纳下。
作者: 赵太云 时间: 2013-7-17 18:52
v = c; //就是向上转型,子类型的引用转成父类型的引用。在执行时,会执行子类对象中的相应的drive()方法,所以结果当然是"Car: drive"。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |