类型转换
由于Java是强类型转换,所以要进行有些运算的时候,需要用到类型转换。
字节大小
低容量(小) —————————————————————————————————————> 高容量(大)
byte 、 short 、 char -> int -> long -> float -> double
运算中,不同类型的数据先转化为同一类型,然后进行运算
为什么 long 是 46 字节却排在 float 32 字节之后呢?
因为,小数的优先级一定大于整数,浮点数的数值范围比整数的数值范围大
-
强制类型转换 (类型)变量名 高 -> 低
- 低容量转低容量时,需要(类型)变量名,进行强制转换
//举例(所有代码最好跟着写,更方便理解) int i = 128; byte b = (byte) i; //强制类型转换 System.out.println(i); System.out.println(b); //运行结果为 128 -128 /* 为什么是i等于128,而b却等于-128? 因为:Byte的最大值是127,然而给它赋值了一个128, 就会出一个叫做“内存溢出”的问题 内存提出,值就会完全变样了 需要尽量避免 */
-
自动类型转换 低 -> 高
- 低容量转低容量时,会自动进行转换,不需要进行任何多余的操作
//举例 int i = 128; double b = i; System.out.println(i); System.out.println(b); //运行结果为 128 128.0 //自动转换成浮点数,所以带上了小数点
举例:小水杯可以把水倒进大水杯里,大水杯的水倒进小水杯就会溢出(尽量避免,下面也有讲解)
顺口溜:低到高自动转,高到低需强转
注意点:
- 不能对布尔值进行转换
- 不能把对象类型(变量也叫对象)转换为不相干的类型
- 在把高容量转换到低容量的时候,要强制转换
- 转换的时候可能存在内存溢出或者精度问题
//精度问题举例
System.out.println((int)23.4);
System.out.println((int)-45.89f);
//运行结果为
23
-45
//强制转换造成的精度丢失
//再次为强制转换举例
char c = 'a';
int d= c+1;
System.out.println(d);
System.out.println((char)d);
//运行结果为
98
b
/*
所有字符本质都是数字(详情百度:Unicode表)
c=a=97,c+1自然等于98,强制转换后98就是b了
*/
操作比较大的数的时候,注意溢出问题
//举例
int money =1000000000;
/*
上面那么多零是不是让人看得眼花缭乱呢,很好解决
JDK7 新特性:数字间可以使用“_”分割,且“_”并不会被输出
*/
int money =10_0000_0000;
int year = 20;
int total = money*year;
System.out.println(total);
//运行结果为
-1474836480 //内存溢出
//这里有人会想到加一行这样的代码
long total2 = money*year;
/*
运行结果仍然为:-147483648
因为第8行与第9行是int类型,
于是在 money*year 这里计算完会转换为int,
第23行这一步骤进行之后才会转换为long类型,
也就表明,在转换long之前就已经存在问题
所以不可以这样做
*/
//正确的应该这样
int money = 10_0000_0000;
int year = 20;
int total = money*year;
//这样可以提升整个表达式,全部用long计算,就没有问题了
long total2 = ((long)money*year);
System.out.println(total2);
//运行结果为
20000000000