D和C的关系:只有A实现的D,所以
C c = new A();D d = (D)c;
应该等同于D c=(D)(new A());这里是向上转型;
转型分为向上转型和向下转型
向上转型是父类引用指向子类对象,格式为 父 f=new 子();
打个比方,当需要讲一系列子类对象作为参数传递给一个函数的时候,就可以只写一个方法,而参数仅仅是父类对象,这样只需要创建其中一个子类对象并加以父类引用即可,讲父类的引用作为参数传递就可以实现具体的子类对象作为参数传递的效果,也就是说讲"写多个方法"转变为"只写一个方法而随时创建需要的指向该子类对象的父类引用"即可
这样无论是在代码的简洁还是在开发中的后期 维护方面都有很大的优势.向上转型通常是程序员自己编写程序的时候用到.
向下转型则类似于强转,是将被父类引用指向的对象改为自己类引用对象,格式为: 子 z=(子)f;(其中f为指被父类引用指向的子类实例)
还是举个参数传递的例子,这里用Object来说明,比如一个方法中本来实现的功能是对传入的字符串进行操作,但是在写方法的时候却可以吧参数类型写为Object,即你传入什么样的参数都可以,暂时不对参数进行过滤,但是在方法中却需要对传入的参数进行判断,通常用 obj instanceof String来实现,如果obj确实是String类的一个实例,那么才能向下转型,并调用子类对象的特有方法.当不判断的时候则可以选择抛出异常,如果传入String的实例同样可以继续操作.向下转型的原因是是放宽了参数传递的范围,通常是面向客户的时候采用,而将麻烦留给自己,调用子类对象的特有方法.
①
short a =0 ;
int i = a;
a = (short)i;
②
A a = new A();
C c = a;
A a1 = (A)c;
区别在于
基本类型的转换是以存储该数据的字节容量为依据的,int i=a时会吧两个字节的a用一个四字节的内存存储,并在前面两个字节的长度补上0,是内存转换的关系.而int转short时则是讲int数强行压到short的内存中,原则是不损失精度.
对象的类型转换是已是否为父子类或者是否是接口和实现类的关系为依据的.C c=a;时把一个父类引用指向了子类对象,是指向的关系,我们可以把这只小鸟说成是一只小动物,却不可以吧一个short型字符说成是这个int型字符,而A a1 = (A)c;则是把A类型实例的父类引用转换为该类引用,我们可以吧一只是小鸟的小动物说成小鸟,却不可以吧一个
比short类型字节数长的相等的int型字符说成是short型字符.
区别有种种说法,重在理解,以上内容纯手打,还望楼主不吝赏币!
|