黑马程序员技术交流社区

标题: 关于多态里的类型转换 [打印本页]

作者: --_.Is’攸稀    时间: 2013-10-31 10:23
标题: 关于多态里的类型转换
本帖最后由 --_.Is’攸稀 于 2013-10-31 12:31 编辑

今天在看着毕向东的视频,讲到多态这,里面的类型转换有点不怎么懂,帮分析下
abstract class animal
{
abstract void eat();
}
class cat extends animal
{
void eat(){System.out.println("鱼");}
void play(){System.out.println("抓老鼠");}
}
class Demo{
public static void main(String args[])
   {
animal a=new cat();
a.eat();
cat b=(cat)a;           //想问这里的话是不是把对象a名字改成了b,但能不能不改名字就是cat a=(cat)a;?
b.play();                   //

}
}

作者: ☆╰學不会☆╮    时间: 2013-10-31 11:14
animal  a=new cat();  // 向上转型  a能用的方法只能是animal父类中的方法 a.eat();  但是由于引用的是子类的对象 所以a.eat(); 是子类中重写覆盖的父类方法、。
所以输出结果是 鱼。
cat b=(cat)a;   //强制将父类的引用,转换成子类类型; b可以引用的方法可以是eat() 也可以是 .play()方法;
如果 把 b改成a  cat a=(cat)a;  a变量和 向上转型的变量名字相同 再引用方法时,就不会出现子类中.play()方法了。
作者: 0从谷0    时间: 2013-10-31 11:35
楼主的问题:  cat b=(cat)a;           //想问这里的话是不是把对象a名字改成了b,但能不能不改名字就是cat a=(cat)a;?

1. 这行代码不是将对象a 的名字改成了b,而是强制类型转换,将Animal 对象转换成Cat对象(注意我这句话容易造成误解。父类对象是不能强制转换成子类对象的),因为变量a 本身接收的就是一个Cat对象,所以可以强制类型转换。
2.cat a=(cat)a; 这个是不可以的,原因很简单,因为前面已经定义了变量a 。
作者: --_.Is’攸稀    时间: 2013-10-31 12:30
0从谷0 发表于 2013-10-31 11:35
楼主的问题:  cat b=(cat)a;           //想问这里的话是不是把对象a名字改成了b,但能不能不改名字就是cat ...

哦,明白了。
作者: ixiangfeng    时间: 2013-10-31 12:50
加油 今天早上看完多态了
作者: 那得好好想想    时间: 2013-10-31 18:27
b是猫类的对象,a是猫类的引用变量,但是a绝对不能是动物类的实例变量,因为动物类是抽象的。也就是说当前a这个变量,必须有个实例化的对象指向它,所以只能是猫这个类,否则报错,如果动物类还有一个狗类做子类,那么狗类也可以指向a。
所以,你写Cat a=cat a=(cat)a;这样写会报错,a其实跟Cat没有关系,a就是动物类的一个多钟形态的变量,等待着其他子类去指向它。以上是我个人理解。




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