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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘晓 中级黑马   /  2013-6-8 18:28  /  1373 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘晓 于 2013-6-8 21:17 编辑

Animal a= new Cat( );
Cat c=(Cat) a;//强制将父类的引用转换为子类类型。
其中Cat是Animal的子类,我想问的是 a是不是Cat类的对象?
如果不是,那毕老师的视频里为何在没有强制转换父类引用的时候写 a.猫的方法

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 刘海芳 于 2013-6-8 18:51 编辑

无需强制,java的多态会使c向下转型为cat,即c就是cat的对象,可以用instanceof关键字来测试,instanceof是用来判断某个对象是否属于某个类
  1. public class Cat extends Animal{
  2.         public static void main(String[] args) {
  3.                 Animal a=new Cat();
  4.                 //instanceof是用来判断某个对象是否属于某个类
  5.                 System.out.println(a instanceof Cat);
  6.                 //output:true
  7.         }
  8. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
创建对象时,a对象是 上转型对象,也就是说猫是动物成立,但说动物是猫不成立。当猫是动物上转型时,猫失去了自有的方法,但Animal方法是能调用的,这时候的a就是Animal ,当你运行时,会把a绑到Cat身上,叫运行时多态。希望对你的疑惑有帮助

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报

a不是Cat类的对象  是Animal类型的引用变量
  1. class Animal
  2. {
  3.         public void eat(){
  4.                 System.out.println("Animal is eating...");
  5.         }
  6. }

  7. class Cat extends Animal
  8. {
  9.         public void eat(){
  10.                 System.out.println("Cat is eating...");
  11.         }
  12. }

  13. class TestDuoTai
  14. {
  15.         public static void main(String[] args){
  16.                 Animal a =new Cat();
  17.                 a.eat();
  18.         }
  19. }
复制代码
打印结果
*************************

D:\BlackHorse_Pro\IO>java TestDuoTaiCat is eating...

*************************
毕老师从字面意义上进行了理解:
Animal a =new Cat();
赋值运算 先计算右边的 知道  这是个Cat类型的  左边声明的是Animal类型的  所以  a就是多态  两种身份 : (1)Animal类型的  (2). 也是Cat类型的

由于函数或者方法具有重写的特点(类似于生物中的变异) 只要子类中重写了父类中的方法  调用的时候,就会调用子类中重写的方法
所以这里面虽然是父类的引用  但是 指向的是Cat子类 Cat子类中又一次重写了eat()方法  所以 打印Cat is eating

***********************
内存图上理解
a是Animal类型的引用变量  指向的是堆内存中Cat类型的对象实例  尽管a是父类的引用 但是 a代表的是子类的对象 所以  由于 指向的子类的对象  并且方法被重写
a.eat()调用的就是a代表的Cat这个子类对象对应的重写的eat()的方法


回复 使用道具 举报
先给说说这两句话什么意思:
Animal a= new Cat( ); // 类型提升,向上转型(Cat类型自动提升为了Animal型)
Cat c=(Cat) a; // 强制将父类引用转换成了子类类型,向下转型,这里的a是Animal类型,然后(Cat)a,转换为子类类型
所以就可以a.猫的方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马