黑马程序员技术交流社区

标题: 关于多态的问题 [打印本页]

作者: 李会成    时间: 2013-2-1 18:24
标题: 关于多态的问题
本帖最后由 李会成 于 2013-2-2 13:55 编辑

在第八天讲多态的时候,有这样一段代码:

  1. abstract class Animal
  2. {
  3.         public abstract void eat();
  4. }
  5. class Cat extends Animal
  6. {
  7.         public void eat()
  8.         {
  9.                 System.out.println("eat fish");
  10.         }
  11.         public void catchMouse()
  12.         {
  13.                 System.out.println("catch mouse");
  14.         }
  15. }
  16. class Dog extends Animal
  17. {
  18.         public void eat()
  19.         {
  20.                 System.out.println("eat bone");
  21.         }
  22.         public void watchHome()
  23.         {
  24.                 System.out.println("watch home");
  25.         }
  26. }
  27. class PolymorphismDemo
  28. {
  29.         public static void main(String[] args)
  30.         {
  31.                 function(new Cat());
  32.                 function(new Dog());
  33.         }
  34.         public static void function(Animal a)
  35.         {
  36.                 a.eat();
  37.         }
  38. }
复制代码
疑问1.倒数第三行的a.eat()这个a调用的eat()方法为什么是子类的方法,而不是父类的?
2.我百度了下,查到说是引用变量a有2个类型,编译的时候类型为Animal,运行的时候类型为子类,所以在代码编译过程中,a调用的是Animal的eat()方法, 在运行代码的时候调用的是子类的eat()方法,这就是多态,那么我的第一个问题应该这样解释吗?这个方法的调用顺序是java的特性吗?


作者: Gaara    时间: 2013-2-1 19:27

  1.         public static void main(String[] args)

  2.         {

  3.                 function(new Cat());

  4.                 function(new Dog());

  5.         }

  6.         public static void function(Animal a)//相当于Animal a=new Cat(); Animal a=new Dog();

  7.         {

  8.                 a.eat();

  9.         }

  10. }
复制代码
所以就是创建了子类的对象

因为多态的特点:成员函数,在多态调用时,编译看左边,运行看右

作者: vmvm555    时间: 2013-2-1 19:30
我是这么理解java多态的,多态的条件
1.继承
2.重写某个方法
3.父类引用指向子类对象
这里的继承可以是继承某个父类(抽象类也可以),或者实现某个接口,重写某个方法是指子类和父类(或接口中)中相同参数名,以及参数类型,参数个数相同,从新定义一个方法体,这样在使用父类 f = new子类()创建对象时,f引用只能调用父类中特有的方法,但如果子类将父类中的方法覆写的话,执行的语句就是子类的方法体
作者: 张权    时间: 2013-2-2 13:14
本帖最后由 张权 于 2013-2-2 13:15 编辑

楼主,其实楼上的张文彬回答的很好,如果这样你还不明白,说明你没有理解多态!
class PolymorphismDemo

{

        public static void main(String[] args)

        {

                function(new Cat());
//你这里调用function(Animal a) 方法,传递进去的是子类对象new Cat()和子类对象new Dog()
//也就是说父类引用指向子类对象,你要记住一点,在继承多态中,调用方法有个特点
//能调用哪个方法看引用,具体调用哪个看引用所指向的实例对象,就拿这个例子来说,
//function(new Cat())其实就是  Animal a = new Cat();
//那么首先我们看引用a,他有没有eat()这个方法,有,那么说明能调用,那么接下来再看实力对象
//实例对象是new Cat(),那么调用的就是Cat的eat()方法。  其实多态就这么简单,只要记住我前面那句话就
//好,不过楼主还要注意,静态和私有修饰的方法没有多态,没事自己多敲代码验证一下就OK了!!!
                function(new Dog());

        }

        public static void function(Animal a)

        {

                a.eat();

        }

}

   
作者: 李会成    时间: 2013-2-2 13:55
谢谢我明白了
作者: 李培根    时间: 2013-2-18 11:34
请勿复制他人帖子,技术分不是入学的门槛而是为了帮助大家学习而存在的。

请勿再次发此类帖子了!

此贴就关闭了。此后如有再次发现直接封禁处理,请看到此贴的会员也加以注意。





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