类型转换
在Java程序中,不同的基本类型的值经常需要进行相互转换。Java语言所提供地7种数值类型之间可以相互转换,有两种类型的转换方式:自动类型转换和强制类型转换。
自动类型转换
Java所有的数值型变量可以相互转换,如果系统支持把某种基本类型的值直接赋给另一种基本类型的变量,则这种方式被称为自动类型转换。当把一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,系统将可以进行自动类型转换;否则就需要强制转换。表数范围小的可以向表数范围大的进行自动类型转换,就如同有两瓶水,当把小瓶里的水倒入大瓶中时不会有任何问题。Java支持自动类型转换的类型如下图所示:
图中所示的箭头左边的数值类型可以自动类型转换为箭头右边的数值类型。
强制类型转换
如果希望把自动类型转换图中箭头右边的类型转换为左边的类型,则必须进行强制类型转换,强制类型转换的语法格式是:(targetType)value,强制类型转换的运算符是圆括号(())。当进行强制类型转换时,类似于把一个大瓶子里的水倒入一个小瓶子,如果大瓶子里的水不多还好,但如果大瓶子里的水很多,将会引起溢出,从而造成数据丢失。这种转换也被称为“缩小转换(Narrow Conversion)”。
注意!!!
运算中,不同类型的数据先转化为同一类型,然后进行运算。
类型转换实例(具体会涉及的问题,和方法可借鉴):
public class Demo04 { public static void main(String[] args) { int i = 128; byte b = (byte)i;//内存溢出 //强制转换 (类型)变量名 高——低 //自动转换 低——高 System.out.println(i); System.out.println(b); int i2 = 128; double b2 = i2;//内存溢出 //强制转换 (类型)变量名 高——低 //自动转换 低——高 System.out.println(i2); System.out.println(b2); /* * 注意点: * 1.不能对布尔值进行转换 * 2.不能把对象类型转换为不相干的类型 * 3.在把高容量转换到低容量的时候,强制转换 * 4.转换的时候可能存在内存溢出,或者精度问题!*/ System.out.println("========================"); System.out.println((int)23.7);//23 System.out.println((int)-45.89f);//-45 System.out.println("========================"); char c = 'a'; int d = c+1; System.out.println(d); System.out.println((char)d); } }
运行结果:
public class Demo05 { public static void main(String[] args) { //操作比较大的数的时候,注意溢出问题 //JDK7新特性,数字之间可以用下划线分割 int money = 10_0000_0000; int years = 20; int total = money*years;//-1474836480, 计算的时候溢出了 System.out.println(total); System.out.println("========================================"); //方法2 不可取!!!! int money2 = 10_0000_0000; int years2 = 20; int total2 = money2*years2;//-1474836480, 计算的时候溢出了 long total3 =money2*years2;//默认是int,转换之前已经存在问题了 System.out.println(total3); System.out.println("========================================"); //最终解决办法 int money3 = 10_0000_0000; int years3 = 20; int total4 = money3*years3;//-1474836480, 计算的时候溢出了 long total5 = money3*((long)years3);//先把一个数转换为long System.out.println(total5); } }
运行结果: