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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王广彬 中级黑马   /  2012-8-8 21:24  /  1940 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

interface Animal                //定义接口
{
        public abstract void eat();
        public abstract void play();
}
class Dog implements Animal
{
        public void eat(){
                System.out.println("狗爱啃骨头!");
        }
        public void play(){
                System.out.println("狗爱玩球");
        }
        public void color(){
                System.out.println("这条狗是黑色的!");
        }
}
class Cat implements Animal
{
        public void eat(){
                System.out.println("猫喜欢吃鱼");
        }
        public void play(){
                System.out.println("猫喜欢爬树");
        }
        public void sleep(){
                System.out.println("猫爱睡觉");
        }
}
class DuoTaiDemo
{
        public static void main(String[] args)
        {
                Animal a=new Dog();  //向上转型
                a.eat();
                a.play();
                Dog d=(Dog)a;                //向下转向
                d.color();
                a=new Cat();                //向上转向
                a.eat();
                a.play();
                //Cat c=(Cat)a;
                if(a instanceof Dog){       
                        d=(Dog)a;
                        d.color();
                }else if(a instanceof Cat){
                        Cat c=(Cat)a;
                        c.sleep();
                }
               
        }
}

这段代码运行结果是:
狗爱啃骨头!
狗爱晚球
这条狗是黑色的!
猫喜欢吃鱼
猫喜欢爬树
猫爱睡觉

如果把
if(a instanceof Dog){       
                d=(Dog)a;
                d.color();
        }else if(a instanceof Cat){
                Cat c=(Cat)a;
                c.sleep();
        }
直接换成
Cat c=(Cat)a;
结果是:
狗爱啃骨头!
狗爱晚球
这条狗是黑色的!
猫喜欢吃鱼
猫喜欢爬树

为什么使用a instanceof Cat判断之后就可以打印出"猫爱睡觉",如果不判断就打印不出来呢?
如果a是Cat的对象,即使不判断也应该可以输出"猫爱睡觉"啊,那为什么如果不判断就输不出来呢?
请各位大侠给说说.小弟在此谢过!

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

6 个回复

倒序浏览
你直接替换了,调用了c.sleep()吗?
回复 使用道具 举报
看了半天 我也想楼上的问题,你调用了吗
回复 使用道具 举报
这个关于    向上转型和向下转型
Animal 是动物类  Dog是狗类  Cat是猫类
                Animal a = new Dog();  //向上转型
                //使用Dog中特有的方法
                Dog d = (Dog) a;  //向下转型

                //注意:不能转换成不同类型的
                Cat c = (Cat)a;
               
                举例:
                孔子爹:教课(java)
                孔子:教课(论语),玩游戏()

                //多态
                孔子爹 k爹 = new 孔子(); //孔子就穿上他爹的衣服,装爹 向上转型
                k爹.教课();  //论语
                //k爹.玩游戏();

                孔子 k = (孔子) k爹;  //脱下衣服,穿上自己衣服。向下转型
                k.玩游戏();
        instanceof关键字
                用于判断某个对象是否是某种引用类型的。
               

点评

o了  发表于 2012-8-9 23:26
回复 使用道具 举报
没调用怎么会运行方法呢!
回复 使用道具 举报
王广彬 来自手机 中级黑马 2012-8-9 18:46:26
地板
我擦,我还是撞墙去吧,搞老半天竟然是没调用,粗心大意害死人啊!各位不好意思,打扰了!
回复 使用道具 举报
问题已解决!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马