黑马程序员技术交流社区

标题: 关于多态的一点小疑问 [打印本页]

作者: tangxiaobo1991    时间: 2014-2-13 13:19
标题: 关于多态的一点小疑问
本帖最后由 tangxiaobo1991 于 2014-2-13 15:37 编辑

小弟刚学到的多态的部分,看了老毕的视频,也基本了解,可是还是发现了一个很奇怪的现象,希望哪位老马能够帮帮新马。看看下面我写的代码。
abstract class Animals
{
abstract void eat();
}
class Cat extends Animals
{
public  void eat()
  {
  System.out.println("eat fish");
}
public void catchMouse()
  {
  System.out.println("catch Mouse");
}
}


class  DuoTai
{
public static void main(String[] args)
{
  
  Animals a=new Cat();
  Cat c=(Cat)a;
  c.catchMouse();
  function(a);
  function(c);//?????
  }
public static void  function(Animals A)
{
  A.eat();
}
}
问题:看上面代码红色部分,我已经把a强制转换成Cat类型了,故c应该是Cat类型。而function(Animals A)中传递的参数是父类Animals类型,编译应该失败,可奇怪的是竟然编译成功并且运行成功。这是为森马呢?下面是运行结果


作者: tangxiaobo1991    时间: 2014-2-13 13:35
不要让我的帖子秒沉啊!!!求大神
作者: 自由自在2014    时间: 2014-2-13 13:49
public static void main(String[] args)
        {
          
          Animals a=new Cat();
           a.eat();     //加上一句
          Cat c=(Cat)a;
          c.catchMouse();
          function(a);
          function(c);//?????
          }


输出结果是:eat fish
               catch Mouse
               eat fish
                eat fish
说明你创建的时候就是子类 a就是子类
作者: 熊冠银    时间: 2014-2-13 14:19
编译当然是不会失败的  因为你的Cat继承了 Animals 而c是Cat类型的 ,父类型必须可以接收子类类型啊 这里也是多态
作者: tangxiaobo1991    时间: 2014-2-13 14:29
熊冠银 发表于 2014-2-13 14:19
编译当然是不会失败的  因为你的Cat继承了 Animals 而c是Cat类型的 ,父类型必须可以接收子类类型啊 这里也 ...

哦,原来如此啊。。学习了
作者: tangxiaobo1991    时间: 2014-2-13 14:31
自由自在2014 发表于 2014-2-13 13:49
public static void main(String[] args)
        {
          

晕,那是覆盖的原因吧。。入如果a就是子类对象,那么a.catchMouse()为什么会失败呢?
作者: 自由自在2014    时间: 2014-2-13 14:48
tangxiaobo1991 发表于 2014-2-13 14:31
晕,那是覆盖的原因吧。。入如果a就是子类对象,那么a.catchMouse()为什么会失败呢? ...

好吧,我理解错了




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