您的位置:首页 > 编程语言 > Java开发

一句话解释java类型的强转

2016-12-22 16:33 691 查看
很多人对java类型之间的转换,强转,那是傻傻分不清楚。

一、直接关系

具有继承关系的类或接口。其实,对于它们之间的转换不难,需要明白转型的一个规律:

向下转型需要强转

那么什么是向下转型?简单的说,常见的说,就是父类转成子类。父亲在上,儿子在下,这叫做向下转型,如:

Object obj = null;//java中所有类的老大,根

String str = null;

str = (String) obj;obj = str;


那么为什么Object类型转成String需要强制转换?
因为Object是java类型的根类,String 是继承自Object,是Object的子类。

子类继承了父类的所有属性,所以子类转为父类,不需要强转;而父类可能不具备子类的所有属性,因此需要强制转换。

这就好像:苹果肯定是果子,但果子不一定是苹果。如果想让某果子变成苹果,只好强制性称呼某个果子为“苹果”。

这对于具有继承关系的接口和类之间同样适用。如:

ArrayList<String> aList = null;//ArrayList<E> implement List<E>
List<String> list = null;//List<E> extends Collection<E>
Collection<String> colle = null;

aList = (ArrayList<String>) list;//下←上,强转
aList = (ArrayList<String>) colle;//下←上,强转
list = (List<String>) colle;//下←上,强转

list = aList; //父类←子类,上←下
colle = list;//父接口←子接口,上←下
colle = aList;//父接口←子类实现,上←下


换而言之,类型A具备类型B的所有属性,那么类型A本身就是类型B的一种,是不需要强制转成类型B的。而类型B不一定具备类型A的所有属性,所以转成类型A,需要强制转换。

还是这个例子:苹果肯定是果子,但果子不一定是苹果。如果想让某果子变成苹果,只好强制性称呼某个果子为“苹果”。

二、间接关系

来看看java的基本类型,它们分别是:byte,char,short,int,long,float,double,boolean8个。除了boolean这个“异类”,基本不会遇到什么转换,那么其他类型之间怎么转换?

java的基本类型的封装类,各自之间没有extends继承关系,但实现的接口存在关系,所以不能简单通过父类子类,向上向下来判断。

我的总结就是,对基本类型而言,强转意味着“砍掉”部分内容,谁的精度高,范围广,转成精度低,范围小的就要强转。

(1)整型和浮点型

有点特殊,乍看之下,浮点型是一堆堆的小数,范围比整型大,整型应该在上,浮点型应该在下。然而,实际上,整数本来就是小数的一种:5=5.0啊,小数却不见得等于整数了:5.1=5?,不等滴。所以谁上谁下不是全部以类型的范围作为判断标准的,不适用。谁强转谁,更关键的地方在于其本身的属性。

小数需要砍掉小数点,才变整数,所以说,这是一个强转的过程。而double的小数比float更多,所以,double转成float也需要砍,强转。

double >>float >>int 强转。

(2)字符型和字节型

字符和字节占用的内存空间不同。char 占2,byte占1。char>>byte 强转。也是看谁多,砍谁。

(3)整型之间

long>>int >> short 强转,砍掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: