黑马程序员技术交流社区
标题:
多态的应用
[打印本页]
作者:
黑马-郑玉元
时间:
2013-3-13 20:11
标题:
多态的应用
本帖最后由 黑马-郑玉元 于 2013-3-13 22:43 编辑
class Test03
{
public static void main(String[] args)
{
Car c = new Car1();
c.work();
}
}
abstract class Car
{
abstract void run();
void work(){
run();//实际上调用的是子类的方法
}
}
class Car1 extends Car
{
void run(){
System.out.println("车开启");
}
}
复制代码
为什么是调用子类的方法???
作者:
谢冬
时间:
2013-3-13 20:22
非静态私有函数的特点:
1、编译时期:参阅引用变量所属类(父类)中是否有调用方法,如果有编译通过,如果没有编译失败
2、运行时期:如果子类中复写了父类中的方法,运行子类中的方法,如果子类没有复写,运行父类自己的方法
作者:
赵亚威
时间:
2013-3-13 20:24
首先new进行实例化 这里是向上自动转型 然后调用work方法 因为父类是抽象的类 即work没有方法体 因为子类中有work方法 所以调用了子类的work方法进行复写。抽象类只是把共同点抽取出来 具体不实现代码 这样提高了代码的扩展性
作者:
刘海浩
时间:
2013-3-13 20:29
程序在编译阶段c被编译器看做Car类型.所以程序在编译阶段c引用绑定的是Car类中的work方法;程序在运行的时候堆中的对象实际上是Cat1类型,而Cat已经重写了run方法,所以程序在运行阶段对象的绑定的方法是Cat1中的run方法.
作者:
张善颖
时间:
2013-3-13 20:41
你的子类Car1继承了父类Car,其实子类里面就有了父类的work()方法,创建了一个对象Car c = new Car1();即父类引用指向子类对象,子类对象就被提升为了父类类型。你用父类的引用c去调用方法work();由于你的子类Car1继承了父类Car,其实子类里面就有了父类的work()方法,并且重写了父类的work()方法。所以 c.work();就是调用的子类中继承过来的父类的方法,并复写了父类的方法,所以输出“车开启”
作者:
陈丽莉
时间:
2013-3-13 22:25
若仍有问题,请继续追问;没问题的话,请将帖子分类改成【已解决】~
作者:
罗威
时间:
2013-3-13 22:25
(父类)Car c = (子类)new Car1();
c.work();
处理多态的问题时有一个规律:(在多态中,方法有重写,变量没有)
非静态成员方法:编译看父类有没有,运行结果看子类有没有,父类没有work();编译失败,子类有work()运行子类,子类没有就运行父类的work();
静态成员方法:编译看父类有没有,运行结果看子类有没有
非静态成员变量:编译看父类有没有,运行结果看子类有没有
静态成员变量:编译看父类有没有,运行结果看子类有没有
希望对你有帮助
作者:
罗威
时间:
2013-3-13 22:30
罗威 发表于 2013-3-13 22:25
(父类)Car c = (子类)new Car1();
c.work();
处理多态的问题时有一个规律:(在多态中,方法有重写 ...
静态成员方法:编译看父类有没有,运行结果看父类
作者:
罗威
时间:
2013-3-13 22:31
罗威 发表于 2013-3-13 22:25
(父类)Car c = (子类)new Car1();
c.work();
处理多态的问题时有一个规律:(在多态中,方法有重写 ...
静态成员方法:编译看父类有没有,运行结果看父类
作者:
罗威
时间:
2013-3-13 22:31
静态成员方法:编译看父类有没有,运行结果看父类
非静态成员变量:编译看父类有没有,运行结果看父类
静态成员变量:编译看父类有没有,运行结果看父类
不好意思,之前复制第一句,忘记改后面的了,后面3句应该是这样的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2