Java语言所提供的7种数据类型(不包括boolean)之间可以相互转换,有两种类型转换方式:自动类型转换和强制类型转换。
一、自动类型转换
Java所有数值类型可以相互转换,如果系统支持把某种基本类型的值直接赋给另一种基本类型的变量,则这种方式称为自动类型转换。当把一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,系统可以进行自动类型转换;否则就需要强制转换。
表数范围小的可以向表数范围大的进行自动类型转换,就如同有两瓶水,当把小瓶的水倒入大瓶种,不会有任何问题;否则就需要强制转换。
自动转换类型程序示范:
1 public class AutoConversion{ 2 public static void main(String[] args){ 3 int a=6; 4 //int类型可以自动转换float类型 5 float f=a; 6 System.out.println(f); 7 //byte类型不能直接转换位char类型,下面代码将报错 8 //AutoConversion.java:9: 错误: 不兼容的类型: 从byte转换到char可能会有损失 9 byte b=9; 10 //char c=b; 11 //System.out.println(c); 12 double d=b; 13 System.out.println(d); 14 } 15 }
不仅如此,当把任何基本类型的值和字符串值进行连接运算时,基本类型的值将自动类型转换为字符串类型,虽然字符串类型不是基本类型,而是引用类型 。 因此 ,如果希望把基本类型的值转换为对应的字符串时,可以把基本类型的值和一个空字符串进行连接。
1 public class AutoConversion{ 2 public static void main(String[] args){ 3 //String str1=5; 4 //上面的代码是错误的,因为5是一个整数,不能直接复制给一个字符串 5 String str2=3.5f+""; 6 System.out.println(str2); 7 //下面语句输出为7hello,先执行3+4=7,在进行类型转换 8 System.out.println(3+4+"hello"); 9 //下面语句输出 Hello!34 ,因为 Hello+3会把3当成字符串处理 10 // 而后再把4当成字符串处理 11 System.out.println("hello"+3+4); 12 }
二、强制类型转换
按照箭头方向,从左到右属于自动类型转换,且其他类型变量+""可以转换为字符串(引用类型),然而从右向左就需要强制转换啦。
强制类型转换的语法格式:(targetType)value,强制类型转换的运算符是圆括号()
当进行强制类型转换时,类似于把一个大瓶子里的水倒入一个小瓶子,如果大瓶子里的水不多还好,但如果大瓶子里的水很多,将会引起溢出 ,从而造成数据丢失 。 这种转换也被称为"缩小转换 ( Narrow Conversion) "。
示例:
1 public class NarrowConversion{ 2 public static void main(String[] args){ 3 int iValue=233; 4 //强制把一个int类型的值转换为byte类型的值 5 byte bValue=(byte)iValue; 6 //输出结果为-23 7 System.out.println(bValue); 8 //强制把一个double类型的值转换为int类型的值 9 double dValue=3.98; 10 int tol=(int)dValue; 11 //输出结果为3 12 System.out.println(tol); 13 } 14 }
分析:
把一个浮点数类型强制转化为int类型的整数时,Java将直接阶段浮点数的小数部分。从此之外,上面的程序还把233强制转换为byte类的整数,从而变成-23,这就是典型的溢出。下图示范这个转换过程:
容易出错的地方:
1、float变量赋值问题
//直接将5.6赋值给float类型的变量将出现错误,因为5.6的默认类型是double
//错误: 不兼容的类型: 从double转换到float可能会有损失 float a=5.6
//正确的用法:
float b=5.6f;
//或float b=float(5.6);
2、在通常情况下,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
例如,把字符串转换成 int 类型,则可通过如下代码实现:
public class Str_intTest{ public static void main(String[] args){ String a="45"; int iValue=Integer.parseInt(a); System.out.println(iValue); } }
执行结果:
Java 为 8 种基本类型都提供了对应的包装类: boolean 对应 Boolean 、byte 对应 Byte 、 short 对应 Short、int 对应 Integer 、 long 对应 Long 、 char 对应 Character 、 float 对应 Float 、 double 对应 Double , 8 个包装类都提供了 一个 parseXxx(String str)静态方法用于将字符串转换成基本类型。
三、表达式类型的自动提升
当一个算术表达式包含多个基本类型的值时,整个算术表达式的数据类型都将会发生自动提升。规则:
1、所有的byte、short、char类型将提升到int类型。
2、整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。操作数的等级排列如图所示,位于箭头右边类型的等级高于箭头左边类型的等级。
典型错误:
short sValue=5; //表达式中的 s Value 将自动提升到 i nt 类型,则右边的表达式类型为 i n t // 将一个 int 类型值赋给 short 类型变量将发生错误 sValue=sValue-5;