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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山西_李帅 中级黑马   /  2013-3-30 21:36  /  2280 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//多态展示,主函数
class DuoTaiDemo1
{
        public static void main(String[] args)
        {
                function(new Cat());
        }
       
        public static void function(Animal a){
                a.eat();
                //判断某一类型是否符合指向的某一对象类型,用instanceof
                if (a instanceof Cat){
                        Cat c = (Cat)a;
                        c.catchMouse();
                }else if (a instanceof Dog){
                        Dog d = (Dog)a;
                        d.kanjia();
                }       
               
        }
}




部分代码, 看过毕老师的视频应该知道。  
这里的Dog d = (Dog)a;是将动物强转成狗吗?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

14 个回复

倒序浏览
在线等喔。  谢谢大家啦。  
回复 使用道具 举报
不是。如果a是Dog的子类,将a转换成Dog。不能将动物转换成狗。
instanceof的作用是判断前者是否属于后者的类或子类。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 25分咯~

查看全部评分

回复 使用道具 举报
是的,是强转成Dog类型

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
Dog d = (Dog)a;这里要先判断a的类型是什么,然后再强转为相应的类型

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
强转之后,以便调用自已特有的方法.
回复 使用道具 举报
HM谢文辉 发表于 2013-3-30 21:41
不是。如果a是Dog的子类,将a转换成Dog。不能将动物转换成狗。
instanceof的作用是判断前者是否属于后者的 ...

Dog是继承了a的子类
回复 使用道具 举报
是的,是吧动物类型转换成狗类型,向下转型
回复 使用道具 举报
这是类型向下转型,也就是说父类的引用赋值给子类,这就叫作向下转型,而把子类对象的引用给父类对象,这叫作向上转型.
向上转型要注意的事项:
     1、它们必须有继承关系。如 dog 继承了Animal,那么 dog的实例对象就可以赋值给Animal的对象,这种赋值可以成功,不需要进行强转换。
向下转型要注意的事项:

   1、它们必须有继承关系。
   2、赋值等号的右边的类型必须确定是等号左边的类型才能转换成功。也就是说把一个父类强转为子类,那么这个父类的引用必须是指向子类的引用。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
算是吧, instanceof是用于判断传进来的类类型,如果条件成立了,就将原本new Cat()==>Animal a(是类型的提升,将Cat类型提升成了Animal类型),又将Animal类型强制转成Cat类型的.
当条件不成立时,else if中的同理.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
public static void function(Animal a){}当我们把一只Dog对象作为参数传递给function(Animal a)函数时,相当于Animal a = new Dog();这是向下类型转换,因为a是Animal类型的所以只能用父类的方法和属性。Dog d = (Dog)a,这是向上类型转换,不是把动物类强转成狗类,而是a本来就是指向Dog的对象,这样做是为了调用Dog类中独有的数据

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 _王涛 于 2013-3-30 22:53 编辑

public static void function(Animal a){
                a.eat();
                //判断某一类型是否符合指向的某一对象类型,用instanceof
                if (a instanceof Cat){
                        Cat c = (Cat)a;
                        c.catchMouse();
                }else if (a instanceof Dog){
                        Dog d = (Dog)a;
                        d.kanjia();
                }        
               
        }
上面代码不是将动物强转成狗,因为用instanceof判断后看输入的a 是否是Dog对象,如果满足条件后才进行向下转型
也就是 Dog d = (Dog)a; a只是父类引用而已,它所指的是子类对象。
希望帮到你!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,继续追问;没有的话,将帖子分类改成【已解决】哦~  
话说个人觉得大家回答的很到位了~
回复 使用道具 举报
是的,这是向下转型把父类转换成子类
回复 使用道具 举报
如果a 是一个Dog类型 或是Dog的子类,便可转换成Dog类型,呵呵,也可以说是父类的引用指向子类对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马