黑马程序员技术交流社区

标题: 多态的应用 [打印本页]

作者: 黑马-郑玉元    时间: 2013-3-13 20:11
标题: 多态的应用
本帖最后由 黑马-郑玉元 于 2013-3-13 22:43 编辑
  1. class Test03
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Car c = new Car1();
  6.                 c.work();
  7.         }
  8. }
  9. abstract class Car
  10. {
  11.         abstract void run();
  12.         void work(){
  13.                 run();//实际上调用的是子类的方法
  14.         }
  15. }
  16. class Car1 extends Car
  17. {
  18.         void run(){
  19.                 System.out.println("车开启");
  20.         }
  21. }
复制代码
为什么是调用子类的方法???


作者: 谢冬    时间: 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