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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© --_.Is’攸稀 中级黑马   /  2013-10-31 10:23  /  1036 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 --_.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();                   //

}
}

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 新人鼓励~

查看全部评分

5 个回复

正序浏览
b是猫类的对象,a是猫类的引用变量,但是a绝对不能是动物类的实例变量,因为动物类是抽象的。也就是说当前a这个变量,必须有个实例化的对象指向它,所以只能是猫这个类,否则报错,如果动物类还有一个狗类做子类,那么狗类也可以指向a。
所以,你写Cat a=cat a=(cat)a;这样写会报错,a其实跟Cat没有关系,a就是动物类的一个多钟形态的变量,等待着其他子类去指向它。以上是我个人理解。
回复 使用道具 举报
加油 今天早上看完多态了
回复 使用道具 举报
0从谷0 发表于 2013-10-31 11:35
楼主的问题:  cat b=(cat)a;           //想问这里的话是不是把对象a名字改成了b,但能不能不改名字就是cat ...

哦,明白了。
回复 使用道具 举报
楼主的问题:  cat b=(cat)a;           //想问这里的话是不是把对象a名字改成了b,但能不能不改名字就是cat a=(cat)a;?

1. 这行代码不是将对象a 的名字改成了b,而是强制类型转换,将Animal 对象转换成Cat对象(注意我这句话容易造成误解。父类对象是不能强制转换成子类对象的),因为变量a 本身接收的就是一个Cat对象,所以可以强制类型转换。
2.cat a=(cat)a; 这个是不可以的,原因很简单,因为前面已经定义了变量a 。
回复 使用道具 举报
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()方法了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马