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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何家旺 黑马粉丝团   /  2013-1-25 16:20  /  1679 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 以计盛 于 2013-1-25 22:56 编辑

abstract class Animal
{
        abstract void eat();

}
class Cat extends Animal
{
        public void eat()
        {
                System.out.println("吃鱼");
        }
        public void catchMouse()
        {
                System.out.println("抓老鼠");
        }
}

class jh
{
        public static void main(String[] args)
        {
                Animal a = new Cat();
                a.eat();
               
                //a.catchMouse();
                //Cat c=(Cat)a;
                //c.catchMouse();        
        }
}
为什么不能直接调用Cat里面的catchMouse()方法,有点疑惑!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

6 个回复

倒序浏览
Animal a = new Cat();
现在是父类引用指向子类对象,调用方法时,只能调用从父类中继承或实现的方法。如果要调用子类的特有方法,则要强转 Cat cat = (Cat)a;,我们知道了a实际上是Cat,这样子强转是没问题的。之后就可以调用了
cat.catchMouse();

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
Animal a = new Cat();
定义一个新的对象,它具有子类cat的属性和行为。
但是要注意的的类型:类型为父类Animal,所以在调用时只可以调用已经继承了Animal的的方法
回复 使用道具 举报

Animal a = new Cat();//父类引用指向了子类对象,那么该子类对象类型得到了提升,

如果要调用子类对象的特有方法,这时就需要,向下转型:Cat c=(Cat)a;

这样才能调用子类对象的特有方法。
回复 使用道具 举报
 多态调用的是子类的方法还是父类的方法
  如果子类和父类有相同的方法,即子类重写了父类的方法,那么执行的方法是子类的。
  即调用谁的方法,由实体对象类型来决定。能调用什么方法,由引用类型来决定。
   向上转型后能调用的方法个数被引用类型限制
  引用是遥控器,遥控器上有几个按键,那么就能调用几个方法。就算实体对象有很多方法,但如果遥控器只有一个按键,那就只能调用一个方法。
回复 使用道具 举报
其实楼主可以这么理解new的过程就是用引用给对象贴标签,而你是要Animal的标签贴给了cat。编译器就会认得Animal,它不知道是cat,你调用cat的方法肯定会出错。你必须明确告诉编译器:“调用吧,我保证就是cat”(cat)a.
回复 使用道具 举报
比老师总结的已经很详细了

class DuoTaiDemo2
{
        public static void main(String[] args)
        {
                //Animal a = new Cat();//类型提升。 向上转型。
                //a.eat();

                //如果想要调用猫的特有方法时,如何操作?
                //强制将父类的引用。转成子类类型。向下转型。
                ///Cat c = (Cat)a;
                //c.catchMouse();
                //千万不要出现这样的操作,就是将父类对象转成子类类型。
                //我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
                //多态自始至终都是子类对象在做着变化。
//                Animal a = new Animal();
//                Cat c = (Cat)a;
               

                /*
                毕姥爷 x = new 毕老师();

                x.讲课();

                毕老师 y = (毕老师)x;


                y.看电影();
                */
                function(new Dog());
                function(new Cat());


        }
        public static void function(Animal a)//Animal a = new Cat();
        {
                a.eat();
                /*
                if(a instanceof Animal)
                {
                        System.out.println("haha");
                }
                else
                */
                if(a instanceof Cat)
                {
                        Cat c = (Cat)a;
                        c.catchMouse();
                }
                else if(a instanceof Dog)
                {
                        Dog c = (Dog)a;
                        c.kanJia();
                }


                /*
                instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)  
                */
       
        }
       


}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马