A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-郑玉元 高级黑马   /  2013-3-13 20:11  /  1453 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-郑玉元 于 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. }
复制代码
为什么是调用子类的方法???

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

9 个回复

倒序浏览
非静态私有函数的特点:
  1、编译时期:参阅引用变量所属类(父类)中是否有调用方法,如果有编译通过,如果没有编译失败
      2、运行时期:如果子类中复写了父类中的方法,运行子类中的方法,如果子类没有复写,运行父类自己的方法

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
首先new进行实例化 这里是向上自动转型 然后调用work方法 因为父类是抽象的类 即work没有方法体 因为子类中有work方法 所以调用了子类的work方法进行复写。抽象类只是把共同点抽取出来 具体不实现代码 这样提高了代码的扩展性

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油,虽然答案有待完善

查看全部评分

回复 使用道具 举报
程序在编译阶段c被编译器看做Car类型.所以程序在编译阶段c引用绑定的是Car类中的work方法;程序在运行的时候堆中的对象实际上是Cat1类型,而Cat已经重写了run方法,所以程序在运行阶段对象的绑定的方法是Cat1中的run方法.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你的子类Car1继承了父类Car,其实子类里面就有了父类的work()方法,创建了一个对象Car c = new Car1();即父类引用指向子类对象,子类对象就被提升为了父类类型。你用父类的引用c去调用方法work();由于你的子类Car1继承了父类Car,其实子类里面就有了父类的work()方法,并且重写了父类的work()方法。所以 c.work();就是调用的子类中继承过来的父类的方法,并复写了父类的方法,所以输出“车开启”

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若仍有问题,请继续追问;没问题的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
罗威 中级黑马 2013-3-13 22:25:37
7#
(父类)Car c = (子类)new Car1();
   c.work();
处理多态的问题时有一个规律:(在多态中,方法有重写,变量没有)

非静态成员方法:编译看父类有没有,运行结果看子类有没有,父类没有work();编译失败,子类有work()运行子类,子类没有就运行父类的work();
静态成员方法:编译看父类有没有,运行结果看子类有没有

非静态成员变量:编译看父类有没有,运行结果看子类有没有
静态成员变量:编译看父类有没有,运行结果看子类有没有

希望对你有帮助
回复 使用道具 举报
罗威 中级黑马 2013-3-13 22:30:54
8#
罗威 发表于 2013-3-13 22:25
(父类)Car c = (子类)new Car1();
   c.work();
处理多态的问题时有一个规律:(在多态中,方法有重写 ...

静态成员方法:编译看父类有没有,运行结果看父类

回复 使用道具 举报
罗威 中级黑马 2013-3-13 22:31:02
9#
罗威 发表于 2013-3-13 22:25
(父类)Car c = (子类)new Car1();
   c.work();
处理多态的问题时有一个规律:(在多态中,方法有重写 ...

静态成员方法:编译看父类有没有,运行结果看父类

回复 使用道具 举报
静态成员方法:编译看父类有没有,运行结果看父类

非静态成员变量:编译看父类有没有,运行结果看父类
静态成员变量:编译看父类有没有,运行结果看父类

不好意思,之前复制第一句,忘记改后面的了,后面3句应该是这样的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马