黑马程序员技术交流社区

标题: 老毕第八天第三讲内容求教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