黑马程序员技术交流社区

标题: 几次输出的都是最近子类的方法,怎么以父类方法输出呢? [打印本页]

作者: Unicorn319    时间: 2014-1-16 16:48
标题: 几次输出的都是最近子类的方法,怎么以父类方法输出呢?
本帖最后由 Unicorn319 于 2014-1-16 17:47 编辑

代码如下,问题在最后; 小伙伴们帮帮忙~~  小弟首贴放在这儿了

  1. class animal {        //定义了一个类animal,有一个方法run,
  2.          public void run(){
  3.                 System.out.println("animal is running");
  4.         }
  5. }
  6. class Dog extends animal{//定义了一个类Dog继承animal,复写方法run,
  7.         public void run() {
  8.                 System.out.println("the dog is running");        
  9.         }
  10.         
  11. }
  12. public class demo03 {

  13.         public static void main(String[] args) {
  14.                 //分别以几种方式创建了dog的实例,并运行
  15.                 animal d1=new Dog();
  16.                 Dog d2=new Dog();
  17.                 animal d3=(animal) new Dog();
  18.                
  19.                 ((animal)d1).run();
  20.                 d2.run();
  21.                 d3.run();
  22.         }
  23. }

  24. /**
  25. * 输出:
  26. * the dog is running
  27. * the dog is running
  28. * the dog is running
  29. * 1 为什么输出都是最近子类的方法??
  30. *
  31. * 2 书上说java 会调用合适 的方法,与动态绑定相似
  32. *         那么动态绑定是什么???
  33. *
  34. * 3怎么实现父类的方法?
  35. * */
复制代码


感谢小伙伴们这么快就把问题解决了~  帖子已经改成提问结束, 大家还可以继续留言~



作者: 银酱    时间: 2014-1-16 17:15
我感觉是你再怎么强转也没用,你创建的对象就是dog类的,运行的时候就会输出dog类。
你可以想象一下堆内存中就是dog对象嘛

作者: qisikudingcha    时间: 2014-1-16 17:34
Java的动态绑定又称为运行时绑定。意思是,程序会在运行的时候自动选择调用哪儿个方法,因为你在子类中重写了父类的run()方法,java编译器先去找子类中的run方法,如果子类中没有定义相应的方法,则到其父类中寻找run()方法,因此你一直调用的是子类中的方法。
你要调用父类方法,在子类中写一个方法,在方法体中用super.run()调用父类方法
作者: Unicorn319    时间: 2014-1-16 17:38
银酱 发表于 2014-1-16 17:15
我感觉是你再怎么强转也没用,你创建的对象就是dog类的,运行的时候就会输出dog类。
你可以想象一下堆内存 ...

我本来是抱着“怎么着都有一个能成”的态度去试的。。。没想到全一样。 拿这些表达能干什么么、、、:L
作者: Unicorn319    时间: 2014-1-16 17:39
qisikudingcha 发表于 2014-1-16 17:34
Java的动态绑定又称为运行时绑定。意思是,程序会在运行的时候自动选择调用哪儿个方法,因为你在子类中重写 ...

哦~ 原来是这样  谢谢!:handshake
作者: 不冬眠的蚂蚁    时间: 2014-1-16 18:14
你把父类的run方法给重写了,那么以后默认都是这个重写的新run方法了
除非你用super.run()才会去调用父类的run方法


作者: Unicorn319    时间: 2014-1-16 18:16
不冬眠的蚂蚁 发表于 2014-1-16 18:14
你把父类的run方法给重写了,那么以后默认都是这个重写的新run方法了
除非你用super.run()才会去调用父类 ...

好的!  谢谢





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2