黑马程序员技术交流社区
标题:
老毕第八天第三讲内容求教Cat c = (Cat)a;这是个什么写法?
[打印本页]
作者:
施俊
时间:
2012-3-8 14:09
标题:
老毕第八天第三讲内容求教Cat c = (Cat)a;这是个什么写法?
具体内容如下:
class DuoTaiDemo
{
public static void main(String[] args)
{
Animal a=new Cat();//类型提升。向上转型。
a.eat();
//如果想要调用猫的特有方法时,如何操作?
//强制将父类的引用转成子类类型,。向下转型。
Cat c = (Cat)a;
c.catchMouse();
//千万不要出现这样的操作,就是将父类对象转换成子类类型。
//我们能转换的是父类引用指向了自己的子类对象时,该引用可以被提升,也可以被转换。
//多态自始至终都是子类对象在做着变化。
//Animal a = new Animal();
//Cat c = (Cat)a;
毕姥爷 x=new 毕老师();
x.讲课();
}
public static void function(Animal a)//Animal a=new Cat();
{
a.eat();
}
}
文中Cat c = (Cat)a;说明了猫是向下转型,也就是把动物向下转成猫,但是这个写法应该怎么理解呢?
在内存中是怎么样的建立过程呀?
作者:
许圣建
时间:
2012-3-8 14:43
你现在问这个问题早了点,你只要理解多态就行了。
这个是执行期型别辨识(runtime type identification,RTTI)
,
简单的解释就是,当你手里拿着一个指向base type的reference时,RTTI机制能够帮你找出其所指的确切型别。
写法上就是强制转换,这种转换在编译时期用来对付编译器语法检测,你不强转,直接让它捉老鼠不可以,不是每个都能抓老鼠的,强转只是语法方式,实际类型a是什么,RTTI在运行时就会为他运行相应的方法,这就是多态的基础。
在内存中并没有特别的操作,因为强转只是改一下类型名字,并不改变对象的任何内容。
作者:
黄云南
时间:
2012-3-8 15:34
前提:Cat是Animal的子类
Animal a = new Cat();
Cat c = (Cat)a;
定义一个Animal类型的变量a存在栈内存中,在堆内存中new(建立)了一个Cat类的对象。把a指向了这个对像。 这样就是父类的应用指向子类的对象
定义一个Cat类型的变量c,(Cat)a是强制将Animal类型的变量a装换成Cat类型的变量,然后将地址赋给变量c。定义变量c只是用来存储(取代)a的。
作者:
黄云南
时间:
2012-3-8 15:41
前提:Cat是Animal的子类
Animal a = new Cat();
Cat c = (Cat)a;
Animal a 是定义一个Animal类型的变量a存在栈内存中,new Cat是在堆内存中new(建立)了一个Cat类的对象。通过“=”把变量a指向了这个对像。 (就是把cat的对象在对内存的地址存放在变量a中)。这样就是父类的应用指向子类的对象。
Cat c是定义一个Cat类型的变量c,(Cat)a是强制将Animal类型的变量a转换成Cat类型的变量,然后才能将地址值赋给变量c。定义变量c只是用来存储a的。
作者:
贠(yun)靖
时间:
2012-3-8 16:59
Animal a=new Cat();//类型提升。向上转型。
你没理解这句话的意思,这句话的意思是
创建一个Animal引用对象,即父类对象,也就是a存放在栈内存,
就是Animal a 前半部分 而后半部分 new Cat();
则是创建了一只小猫(一个对象),并把他存放在堆内存
而栈内存的a是animal类型的引用指向了小猫对象的内存地址
Cat c = (Cat)a; 前半部分就是又重新创建一个Cat小猫的引用 存放
在栈内存中 这时候栈内存中有两个引用 一个是a(animal引用)一个是c(cat引用)
他们两个明显是不同的引用啊,所以需要强制转换 把a强转成c
就是把父类引用 转成子类的 不知你能理解不
作者:
袁野
时间:
2012-3-8 17:27
楼上正解
作者:
石德志
时间:
2012-3-9 09:01
这是是为了应付编译器的,意思就是告诉编译器把这个动物当作猫处理,这样就能调用猫的特有方法抓老鼠,其实这个动物始终是猫,从来没有改变过,只是你声明时把它当作了动物类型,使用的时候当然是要当作猫了,这都是编译器的事
作者:
施俊
时间:
2012-3-9 11:24
贠(yun)靖 发表于 2012-3-8 16:59
Animal a=new Cat();//类型提升。向上转型。
你没理解这句话的意思,这句话的意思是
创建一个Animal引用对 ...
非常感谢,完全理解了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2