java基本数据类型的显示转换和隐式转换

常常遇到需要将一个类型的值赋值给另一个变量,这里面就涉及到数据类型转换,有些数据类型转换在java中是能隐式转换的,还有一些涉及到数据安全的类型转换则必须要使用显示类型转换,是否需要显示类型转换的基本原则是,数据范围大的类型转换为数据范围小的类型需要显示转换,小类型转换为大类型可以直接隐式转换。具体体现为下面的规则:

隐式转换的链条

byte->short->int->long->float->double

char->int

bool不参与任何数据类型的转换

上述隐式转换都是范围小的转换成大的类型

(1)为什么char不能和short互相隐式转换?

看了上面的隐式类型转换你可能会疑惑,java中short和char类型都是两个字节,数据范围大小应该一样大,为什么不能相互隐式转换?这是因为,short类型的是有符号的,范围从-32767——32767,但是char类型是无符号的Unicode整数,范围是0——65535,这两个范围大小虽然一样,但是起始确不一样,互相转换会有丢失数据的风险,所以必须要显示类型转换

(2)隐式转换的精度问题

隐式转换同样存在精度丢失的问题,例如将float类型转换成double类型的数据时,虽然float范围小,精度低,但是采用隐式转换时,double的精度高,表示位数多,float没有那么多的位数来表示double,double比flaot多的位就会是随机数,此时采用显示转换能完全的保证数据的精度不发生改变,如下:

float f = 0.123456789f;
double d = f; // 隐式类型转换

System.out.println(f); // 输出 0.12345679
System.out.println(d); // 输出 0.12345679104328156
--------------------------------------------------
float f = 0.123456789f;
double d = (double)f; // 显示类型转换

System.out.println(f); // 输出 0.12345679
System.out.println(d); // 输出 0.123456789f
---------------------------------------------------

(3)一些特殊情况

一般情况下,大范围转小范围必须要显示转换,特殊情况,当编译器明确知道这个大类型的数值在小类型表示内时,此时转换还是可以隐式转换;如:

char a=10;
//10是一个int类型,但是能直接赋值给char类型,因为10明显在char类型的表示范围内
short b=10;
char c='a'-'a';
//'a'-'a'这个表达式时两个字符常量相减,此时编译器会将两个字符转换成int类型
//再进行运算,最后返回一个int类型的结果;

怎么才算编译器明确知道,就是赋值时使用的是常量或者常量表达式,此时编译器才算知道

但是浮点数转整数就算浮点数在整数范围内,也必须强制类型转换

int a=(int)0.1f;

总结:

1.基本类型的转换是显示还是隐式的原则是:数据范围大的类型转换为数据范围小的类型需要显示转换,小类型转换为大类型可以直接隐式转换。

2.隐式转换在float类型转double类型时存在精度问题

其他类型的类型切换

最后,除了基础类型的类型转换,还有父子类型的相互转换,但是父子类型的转换和基本数据类型之间的转换有所不同,子类型继承父类之后,一般还回添加父类中没有的属性,或者重写父类的方法,所以在内容上,子类是大于父类的,但是在实际类型转换中,父类引用可以直接接收子类的对象实例;

Object o=new String();//子类对象可以有父类引用接收

但是父类对象万万不能使用子类引用接收!!

Object o=new String();//子类对象可以有父类引用接收
String s=new Object();//报错

但是当父类的引用指向的是子类对象时,父类对象还是可以强制类型成子类对象的,如果父类引用指向的不是该子类的对象,就算强制类型转换将父类对象转换为子类对象,还是会报错

Object o=new String();//子类对象可以有父类引用接收
String s=new Object();//报错
s=(String)o;//父类引用指向的是子类对象,可以强制类型转换
s=(String)new Object();//报错

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值