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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李万海 中级黑马   /  2013-3-22 10:02  /  1255 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李万海 于 2013-3-22 16:44 编辑
  1. class Rodent{
  2.    public void eat(){
  3.       System.out.println("Rodent.eat()");
  4.       drink();
  5. }
  6. public void drink(){
  7.      System.out.println("Rodent.drink()");
  8. }
  9. }
  10. class Mouse extends Rodent{
  11. public void drink(){
  12.      System.out.println("Mouse.drink()");
  13. }
  14. }
  15. public class DuotaiTest {
  16. public static void main(String[] args){
  17.    Rodent m = new Mouse();
  18.    m.eat();
  19. }
  20. }
复制代码
其运行结果是什么?并解释一下。谢谢

评分

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

查看全部评分

7 个回复

倒序浏览
Rodent.eat();
Mouse.drink();
第一个是因为继承,Mouse 继承父类的eat方法()
drink方法子类做了覆盖,动态绑定

评分

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

查看全部评分

回复 使用道具 举报
运行结果是
Rodent.eat()
Mouse.drink()

多态的体现是父类引用指向了自己的子类对象。好处是提高了程序的扩展性,但是只能使用父类引用访问父类成员。前提是必须是类与类之间有关系,如继承或实现,通常都存在覆盖,这个程序里,Mouse继承了Rodent,重写了Rodent的drink方法。
new完mouse后,调用了继承了父类的eat方法,eat方法里有打印Rodent(),还有调用本类drink方法。
所以,结果如上。

评分

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

查看全部评分

回复 使用道具 举报
结果如楼上所述
毕老师的视频中说过
  成员函数在多态调用时,编译看左边,运行看右边。
如Fu f = new Zi();
多态中成员变量的特点:无论编译和运行,都参考左边(引用类型所属的类)
多态中,静态成员函数的特点:无论编译还是运行,都参考左边
代码中调用的是成员函数,当然是看右边Mouse类中的方法

评分

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

查看全部评分

回复 使用道具 举报
运行结果你可以自己编译去测试,至于多态是什么,你应该好好去学习基础,因为口头是很难表达清楚的.. 建议你去多花点时间
回复 使用道具 举报
运行结果是:
Rodent.eat()
Mouse.drink()
当到Rodent m = new Mouse();代码时创建的Mouse类型就会向上转型为Rodent类型(并会动态绑定)。用Rodent的对象调用eat()方法时会调用Rodent中的eat()方法因他在继承类中并未被覆盖,当调用drink()方法时会发现他已在继承类中被覆盖了就会调用继承类中drink()方法。

评分

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

查看全部评分

回复 使用道具 举报
多态的指的是编译时类型变化,而运行时类型不变。多态分两种:
1.编译时多态:编译时动态重载;
2.运行时多态:指一个对象可以具有多个类型。
Rodent m = new Mouse() 父类引用指向子类,对象m的编译时类型为Rodent ,运行时类型为Mouse(编译看左边,运行看右边)。
答案是  Rodent.eat()
           Mouse.drink()

评分

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

查看全部评分

回复 使用道具 举报
记得及时处理帖子哦,继续追问,或将分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马