学习数据转换的原因
由于Java是 强类型语言,所以参与“赋值运算”和“算数运算”时需要用到类型转换。
运算中,不同类型的数据先转换为同一类型,然后进行运算。(小数的优先级一定大于整数)
-
byte、short、char -> int -> long(L 64)-> float(32)-> double
char、byte、short三种类型在进行混合运算时,会自动提升数据类型,先转换成int型。其变量可以保存默认为int类型的常量(前提是常量的值在类型的范围内),但是不能直接保存为int类型的变量值,需要进行强制类型转换。
1.1 Java基本数据类型转换
在赋值运算或算术运算时,要求数据类型相同,否则就要进行类型转换。
转换的方式:
自动类型转换(隐式)
强制类型转换(显示)
public static void main(String[] args) {
//强制转换 (类型)变量名 高 --> 低
int i = 128;
byte a = (byte)i; //内存溢出 byte范围: -128 ~ 127
System.out.println("========精度丢失========");
System.out.println((int)23.7); //23
System.out.println((int)-45.89f); //-45
//自动转换 低-->高
double b = i;
System.out.println(i); //128
System.out.println(a); //-128
System.out.println(b); //128.0
System.out.println("=======典型面试题=========");
char c = 'a';
char d = c+1;
System.out.println(d); //98
System.out.println((char)d); //b
}
注意点:
-
不能对布尔值(boolean)进行转换。
-
不能把对象类型转换为不相关的类型。
-
再把高容量转换到低容量时,强制转换。
-
转换的时可能存在内存溢出,或者精度问题。
算数运算中的类型自动转换原则:
如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型,结果为double类型。
否则,如果其中一个操作数是float类型,另一个将会转换为float类型,结果为float类型。
否则,如果其中一个操作数是long类型,另一个会转换为long类型,结果为long类型。
否则,两个操作数都转换为int类型,结果默认为int类型。
public static void main(String[] args) {
//操作比较大得数时,注意溢出问题
//数字间可以用下划线分割
int money = 10_0000_0000;
int year = 20;
int total = money*year; //-1474836480 计算时溢出
long total2 = money*year; //默认是int,转换为long前已出错
long total3 = money*((long)year);//先把一个数转换为long
System.out.println(total);
System.out.println(total2);
System.out.println(total3);
}
结果输出:
-1474836480
-1474836480
20000000000
1.2 自动类型转换
容量小的数据类型可以自动转换为容量大的数据类型(低字节向高字节转换)。
public static void main(String[] args) {
double d = 10; //10其实是int型
System.out.println(d);
System.out.println("=======典型的面试题======");
char c = 'a';
System.out.println(c); // ascli表
}
结果输出:
10.0
======典型的面试题=======
98
1.3 强制类型转换
目标数据类型 变量名(类型)变量名
public static void main(String[] args) {
double d = 88.8; //10其实是int型
int i = (int)num //强制转换,会丢掉精度
System.out.println(i);
System.out.println("======典型的面试题=======");
byte a = 20;
byte b = 10;
byte total = b+a;//为什么报错?b、a在运算时会自动转换成int类型,但用byte类型接收,所以会报错。
byte total = (byte) (b+a);
System.out.println(total);
}
结果输出:
88
======典型的面试题=======
30
char、byte、short三种类型在进行混合运算时,会自动提升数据类型,先转换成int型。其变量可以保存默认为int类型的常量(前提是常量的值在类型的范围内),但是不能直接保存为int类型的变量值,需要进行强制类型转换。