A:自动类型转换
以下两条线路可以自动从左到右的类型转换
byte-short-int-long-float-double
char-int-long-float-double
当把任何基本类型的值和字符串值进行连接运算时,基本类型的值将自动类型转换成字符串类型。
B:强制类型转换
若要想从右边转换成左边的类型,则只能用强制类型转换
其语法格式为:(targetType)value,进行强制类型转换时通常会发生溢出,从而引起数据丢失,如:
int value=233
byte bytevalue=(byte)value
Int类型是4个字节,占32位:
Int类型的233: 0000 0000 0000 0000 0000 0000 0000 0000 1110 1001
byte类型233: 0000 0000 0000 0000 0000 0000 0000 0000 1110 1001
可见此时的bytevalue的值是1110 01001
而负数在计算机里是以补码形式存在的,所以:
bytevalue补码:1110 1001
反码:1110 1000
原码:1001 0111
得到bytevalue的值为:1001 0111 换成十进制:-(16+4+2+1)=-23
通常,字符串类型不能直接转换成基本类型,但可以通过基本类型对应的包装类则可实现,java为八种基本类型都提供的了对应的包装类:
Boolean对应Boolean类,byte对应Byte类,short对应Short类
Int对应Intteger ,long对应Logn类,char对应Character类,float对应Float类,
double对应Double类
8个包装类提供了一个parseXxx(String str)的静态方法用于将字符串转换成基本类型,
如String str=“45”
int intvalue=Integer.parseInt(str);
C:表达式的自动提升
当一个算术表达式中包含多种数据类型的的值时,整个算术表达式的数据类型将发生类型自动提升,有如下规则:
1)所有byte型、short型char型数据将提升为int型
2)整个素数表达式的数据类型将提升到和表达式中最高等级操作数同意的类型
一个典型的错误:
Short s=5;//表达式中s自动提升为int类型,表达式右边类型为int
s=s-2;//s-2为int类型,不能把一个int类型赋值给short类型,除非进行强制类型转换
如果表达式中包含字符串,则“+”不再是加法运算符,而是链接运算符
如:“helloJava”+8+7 得到的是helloJava87
7+8+“hellJava”得到的是15helloJava