黑马程序员技术交流社区

标题: 父类和子类的问题 [打印本页]

作者: 刘晓    时间: 2013-6-8 18:28
标题: 父类和子类的问题
本帖最后由 刘晓 于 2013-6-8 21:17 编辑

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

作者: 刘海芳    时间: 2013-6-8 18:50
本帖最后由 刘海芳 于 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. }
复制代码

作者: 007诸葛亮    时间: 2013-6-8 18:50
创建对象时,a对象是 上转型对象,也就是说猫是动物成立,但说动物是猫不成立。当猫是动物上转型时,猫失去了自有的方法,但Animal方法是能调用的,这时候的a就是Animal ,当你运行时,会把a绑到Cat身上,叫运行时多态。希望对你的疑惑有帮助
作者: 张歆明    时间: 2013-6-8 19:07

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()的方法



作者: 王林涛    时间: 2013-6-8 20:59
先给说说这两句话什么意思:
Animal a= new Cat( ); // 类型提升,向上转型(Cat类型自动提升为了Animal型)
Cat c=(Cat) a; // 强制将父类引用转换成了子类类型,向下转型,这里的a是Animal类型,然后(Cat)a,转换为子类类型
所以就可以a.猫的方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2