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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tangxiaobo1991 中级黑马   /  2014-2-13 13:19  /  1119 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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类型,编译应该失败,可奇怪的是竟然编译成功并且运行成功。这是为森马呢?下面是运行结果

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

6 个回复

倒序浏览
不要让我的帖子秒沉啊!!!求大神
回复 使用道具 举报
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就是子类

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
编译当然是不会失败的  因为你的Cat继承了 Animals 而c是Cat类型的 ,父类型必须可以接收子类类型啊 这里也是多态
回复 使用道具 举报
熊冠银 发表于 2014-2-13 14:19
编译当然是不会失败的  因为你的Cat继承了 Animals 而c是Cat类型的 ,父类型必须可以接收子类类型啊 这里也 ...

哦,原来如此啊。。学习了
回复 使用道具 举报
自由自在2014 发表于 2014-2-13 13:49
public static void main(String[] args)
        {
          

晕,那是覆盖的原因吧。。入如果a就是子类对象,那么a.catchMouse()为什么会失败呢?
回复 使用道具 举报
tangxiaobo1991 发表于 2014-2-13 14:31
晕,那是覆盖的原因吧。。入如果a就是子类对象,那么a.catchMouse()为什么会失败呢? ...

好吧,我理解错了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马