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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孟伟娟 中级黑马   /  2012-11-22 16:58  /  2215 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孟伟娟 于 2012-11-24 21:34 编辑

class Rodent{
   public void eat(){
      System.out.println("Rodent.eat()");
      drink();
}
public void drink(){
     System.out.println("Rodent.drink()");
}
}
class Mouse extends Rodent{
public void drink(){
     System.out.println("Mouse.drink()");
}
}
public class DuotaiTest {
public static void main(String[] args){
   Rodent m = new Mouse();
   m.eat();
}
}
其结果是:Rodent.eat()
Mouse.drink()

解释一下该代码是如何运行的,为什么会出现上述结果?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 加油!

查看全部评分

8 个回复

正序浏览
其实很简单,一句你就能理解了
继承是父类方法的覆盖,方法名称一致,参数序列和类型完全一致,使用时只调用本类方法,即是覆盖了父类的方法。
回复 使用道具 举报
class Rodent{
   public void eat(){
      System.out.println("Rodent.eat()");
      drink();
}
public void drink(){
     System.out.println("Rodent.drink()");
}
}
class Mouse extends Rodent{
public void drink(){
     System.out.println("Mouse.drink()");
}
}
public class DuotaiTest {
public static void main(String[] args){
   Rodent m = new Mouse();
   m.eat();      //    执行这句话的时候,jvm先看看子类有没有eat()方法 没得话再去找父类,结果找到了  eat()里面又调用了drink()方法 同样,先去子类找,结果找到了,所以运行的就是子类的方法了。重写的机制要理解透。
}
}
回复 使用道具 举报
你这个程序是Mouse继承了Rodent类,子类Mouse中重写了父类Rodent的drink()方法,主函数中 Rodent m = new Mouse();是创建了一个子类对象赋给了父类引用,这就是向上转型,m.eat();是m调用eat方法,编译时编译器查看父类方法,如果有此方法则编译通过,但是当运行时从子类方法中运行,如果有此方法则执行子类的,没有的话则去调用父类此方法运行,所以输出Rodent.eat(),而运行 drink();语句时,子类有此方法则调用子类方法输出Mouse.drink()

点评

调用的还是子类的方法,只要继承,那么父类的共有方法都会在子类中的,  发表于 2012-11-23 09:13

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
金鑫 发表于 2012-11-22 17:18
不用谢,老毕的视频中多态的部分有讲到,可以仔细看下视频,就能懂了
我也是新手,大家一起交流 ...

你很厉害呀,都拿到35分了。
回复 使用道具 举报
孟伟娟 发表于 2012-11-22 17:14
懂了,如醍醐灌顶,谢谢啊

不用谢,老毕的视频中多态的部分有讲到,可以仔细看下视频,就能懂了
我也是新手,大家一起交流:lol
回复 使用道具 举报
金鑫 发表于 2012-11-22 17:09
多态中成员函数的特点
编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失 ...

懂了,如醍醐灌顶,谢谢啊
回复 使用道具 举报
多态中成员函数的特点
编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。


1、   因为多态中 Rodent m = new Mouse();父类指向了子类对象,也就是说将子类对象提升为了父类对象。
2、   m.eat(); 提升为父类对象后,调用eat()方法。因为父类中也定义了eat()方法,所以编译通过,如果父类中没有定义该方法,就会编译失败。即所谓的编译看左边,左边即父类。
3、   因为m被提升为父类对象,m.eat()也是调用父类中的方法,但是为什么输出的是Mouse.drink()而不是Rodent.drink()。
      愿意很简单,因为子类中也定义了同名的drink()方法,发生了函数的覆盖,子类覆盖了父类中的同名函数,所以运行的是子类的函数,也就是所说的运行看右边,因为右边是子类。


       

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
class Rodent{
    public void eat(){
       System.out.println("Rodent.eat()");
       drink();
}
public void drink(){
      System.out.println("Rodent.drink()");
}
}
class Mouse extends Rodent{//该类继承了Rodent类,所以就继承了他的eat方法,可是该类重写了drink
                                            //方法,所以运行时按子类重写后的方法输出,因为eat方法调用了drink方法,所以就输出Rodent.eat()Mouse.drink()

public void drink(){
      System.out.println("Mouse.drink()");
}
}
public class DuotaiTest {
public static void main(String[] args){
    Rodent m = new Mouse();
    m.eat();
}
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马