数据类型转换
一、自动类型转换
基本介绍
在 Java 中,精度小的数据类型会自动转换成精度大的数据类型
两条转换链 ⭐
(1)char --> int --> long --> float --> double
(2)byte --> short --> int --> long --> float --> double
注意:char btye short 之间并没有转换关系
转换规则
(1)多种数据类型混合运算时,系统首先自动将所有数据转成容量最大的那种数据类型,然后进行计算
(2)当我们把精度大的数据类型赋值给精度小的数据类型时就会报错,反之就会自动类型转换
(3)(byte、short)和 char 之间不会相互自动转换
(4)byte、short、char 他们三者可以计算,在计算时首先转换成 int 类型
注意点:只要以上三者参与混合运算,无论出现了相同类型还是不同类型,计算结果都是 int 类型
(5)boolean 不参与数据类型转换
自动提升原则 ⭐
表达式结果的类型自动提升为操作数中最大的类型
代码示例
java
// 自动类型转换细节
public class AutoConvertDetail {
// 编写一个 main 方法
public static void main(String[] args) {
// 细节1:有多种类型的数据混合运算时,
// 系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
int n1 = 10; // ok
// float d1 = n1 + 1.1; // 错误,n1 + 1.1 => 结果类型是 double
// double d1 = n1 + 1.1; // 正确,结果是 double
float d1 = n1 + 1.1F; // 正确,结果是 float
// 细节2:当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,
// 就会报错,反之就会进行自动类型转换
// int n2 = 1.1; // 错误,double -> int
// 细节3:(byte, short) 和 char 之间不会相互自动转换
// 当把具体数赋给 byte 时,(1)先判断该数是否在 byte 范围内,如果是就可以
byte b1 = 10; // 正确,范围在 -128~127
// int n2 = 1;
// byte b2 = n2; // 错误,变量赋值需要类型兼容
// char c1 = b1; // 错误,byte 不能自动转成 char
// 细节4:byte, short, char 他们三者可以参与运算,在计算时首先转换为 int 类型
byte b2 = 1;
byte b3 = 2;
short s1 = 1;
// short s2 = b2 + s1; // 错误,结果是 int,不能自动赋值给 short
int s2 = b2 + s1; // 正确,b2 + s1 => int
// byte b4 = b2 + b3; // 错误,b2 + b3 => int
// boolean 不参与类型转换
boolean pass = true;
// int num100 = pass; // 错误,boolean 不参与类型的自动转换
// 自动提升原则:表达式结果的类型自动提升为操作数中最大的类型
byte b4 = 1;
short s3 = 100;
int num200 = 1;
float num300 = 1.1F;
double num500 = b4 + s3 + num200 + num300; // float -> double
}
}二、强制类型转换
基本介绍
精度大的数据类型转成精度小的数据类型
存在的问题
(1)精度缺失
(2)内存溢出
转换规则
(1)在变量值前面用小括号加数据类型
例如:float a = (float)1.1,注意在 Java 中小数默认是double类型,把一个精度大的数据类型赋值给精度小的数据类型必然报错
(2)作用范围:只对离强制转换最近的操作数有效
(3)括号可以改变优先级
例如:对表达式的结果进行强制类型转换,double a = (float)(2.5*3+9),float 赋值给 duuble 属于是低精度赋值给高精度,操作合法
使用细节
(1)char 类型可以保存 int 的常量值,但是不能保存 int 的变量值,需要强制类型转换
错误案例:int m = 100 , char c = m
解释:int 赋值给 char ,高精度不能赋值给低精度
(2)byte 和 short, char 类型在运算时,当作 int 类型处理
三、字符串类型转换
转成字符串
转换思路:和空字符串拼接
转换方法:变量 + ""
转成基本数据类型
(1)转换思路:利用包装类的 parse 方法
(2)方法格式:包装类 . parse 包装类("字符串")
包装类名说明
(1) char 是 Character(只有数字才能转换)
(2) int 是 Integer
(3) 其余的包装类名都是首字母大写
(3)方法介绍
java
String s5 = "123";
int num1 = Integer.parseInt(s5);
double num2 = Double.parseDouble(s5);
float num3 = Float.parseFloat(s5);
long num4 = Long.parseLong(s5);
byte num5 = Byte.parseByte(s5);
boolean b = Boolean.parseBoolean("true");
short num6 = Short.parseShort(s5);转成 char 字符类型
方法:字符串 . charAt ( 索引 )
java
public class Main {
public static void main(String[] args) {
String s = "hello";
char c = s.charAt(0);
System.out.println(c);
}
}四、char 转 int
(1)如果 char 类型是数字字符:可以转换
(2)如果 char 类型是字符:程序异常(Exception)
利用 ASCll 码差值 ⭐
java
public class Main {
public static void main(String[] args) {
char c = '5';
int num = c - '0';
System.out.println(num);
}
}自动类型转换
java
public class Main {
public static void main(String[] args) {
int c = 'a';
System.out.println(c);
}
}强制类型转换
java
public class Main {
public static void main(String[] args) {
int c = 'a';
int num = (int)c;
System.out.println(num);
}
}五、随堂练习
判断以下表达式是否能够通过编译
第一组
java
short s = 12; //ok
s = s - 9; // 错误 int -> short
byte b = 10; // ok
b = b + 11; // 错误 int -> byte
b = (byte)(b + 11); // 正确,使用强转第二组
java
char c = 'a'; //ok
int i = 16; //ok
float d = .314F; //ok
double result = c + i + d; //ok float -> double第三组
java
byte b = 16; //ok
short s = 14; //ok
short t = s + b; // 错误 int -> short