Skip to content

数据类型转换


一、自动类型转换

基本介绍

在 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