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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Jim-剣◆﹏ 于 2013-10-19 00:02 编辑

  1. abstract class Animla
  2. {
  3.         String type;
  4.         Animla()
  5.         {}
  6.         Animla(String type)
  7.         {
  8.                 this.type = type;
  9.         }
  10.         public abstract void move();
  11. }
  12. class Fish extends Animla
  13. {
  14.         Fish(String type)
  15.         {
  16.                 super(type);
  17.         }
  18.         public void move()
  19.         {
  20.                 sop("鱼儿游动");
  21.         }
  22.         public void fishEat()
  23.         {
  24.                 sop("鱼儿吃饲料");
  25.         }
  26.         public static void sop(Object obj)
  27.         {
  28.                 System.out.println(obj);
  29.         }
  30. }
  31. class Snake extends Animla
  32. {
  33.         Snake(String type)
  34.         {
  35.                 super(type);
  36.         }
  37.         public void move()
  38.         {
  39.                 sop("蛇爬行");
  40.         }
  41.         public void snakeEat()
  42.         {
  43.                 sop("吃老鼠");
  44.         }
  45.         public static void sop(Object obj)
  46.         {
  47.                 System.out.println(obj);
  48.         }
  49. }
  50. class  TestDemo33
  51. {
  52.         public static void main(String[] args)
  53.         {
  54.                 Animal an =        new Snake("蛇");
  55.                 acceptAnimal(an);
  56.         }
  57.         public static void acceptAnimal(Animal an)
  58.         {
  59.                 /*父类引用接收子类对象,如果直接调用子类特有方法,编译会不通过
  60.                
  61.                 */
  62.                 if(an instanceof Snake)
  63.                 {
  64.                         Snake sn = (Snake)an;
  65.                         sn.snakeEat();
  66.                 }
  67.                 else if(an instanceof Fish)
  68.                 {
  69.                         Fish fs = (Fish)an;
  70.                         fs.fishEat();
  71.                 }
  72.                 else
  73.                         return ;
  74.         }
  75. }
复制代码
我查了书,多态发生向下转型时必须首先发生向上转型,代码中Animla是父类,Fish和Snake是子类,在主函数中,Animal an =        new Snake("蛇");发生了向上转型,acceptAnimal(an);调用函数用instanceof判断,为什么编译还是不通过
错误提示为:
TestDemo33.java:65: 错误: 不兼容的类型
                Animal an =     new Snake("蛇");
                                ^
  需要: Animal
  找到:    Snake
TestDemo33.java:73: 错误: 不可转换的类型
                if(an instanceof Snake)
                   ^
  需要: Snake
  找到:    Animal
TestDemo33.java:75: 错误: 不可转换的类型
                        Snake sn = (Snake)an;//
                                          ^
  需要: Snake
  找到:    Animal
TestDemo33.java:78: 错误: 不可转换的类型
                else if(an instanceof Fish)
                        ^
  需要: Fish
  找到:    Animal
TestDemo33.java:80: 错误: 不可转换的类型
                        Fish fs = (Fish)an;
                                        ^
  需要: Fish
  找到:    Animal
5 个错误


是不是因为父类是抽象类的缘故?

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 很给力!

查看全部评分

4 个回复

倒序浏览
没什么大问题,你Animal类定义的时候类名是Animal
而后面的extends后的都是Animla
估计是你复制来复制去,后面的子类继承的类名都错了
回复 使用道具 举报
第55、58行的Animal与2行的Animla
不一致......
回复 使用道具 举报
楼上正解!!
回复 使用道具 举报
单词写错了…… 能有关系才有鬼了…… animal  和animla ……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马