秦疆的Java课程笔记:25 基础 类型转换

发布时间 2023-11-10 17:21:22作者: Acolyte_9527
  • 由于Java是强类型语言,在某些运算时会需要类型转换。
  • 数据类型容量由低到高分别为:
    byte&short&char<int<long<float<double
    (浮点数的优先级大于整数)
  • 运算中,不同类型的数据先转换为同一类型,再进行计算。
  • 高容量类型到低容量类型需进行强制转换。
  • 低容量类型到高容量类型会自动转换。

1、强制转换

public class DEMO1 {  
    public static void main(String[] args) {
        //强制类型转换  高到低
        int i = 128;  
        byte b = (byte)i;//将高容量量int强制转换为低容量byte 
        System.out.println(i); 
        System.out.println(b);  
    }  
}

输出结果为:
128
-128

  • byte的取值范围为-128-127,发生了内存溢出。
  • 转换时要注意避免内存溢出!!

2、自动转换

public class DEMO2 {  
    public static void main(String[] args) {
		//自动类型转换 低到高  
		int c = 128;  
		double d = c;//将低容量int转换为高容量double,不要需要任何指令  
		System.out.println(c);  
		System.out.println(d);  
    }  
}

输出结果为:
128
128.0

  • 不能对boolean值进行转换。
  • 不能把对象类型转换为不相干的类型。
  • 转换时可能存在内存溢出,或精度问题。

3、精度损失

public class DEMO3 {  
    public static void main(String[] args) {
		//精度损失  
		System.out.println((int)3.1415926); 
		System.out.println((int)-114.514F);
    }  
}

输出结果为:
3
-114

  • 因为是把小数转换为了整数,舍弃了所有小数位(不是四舍五入,是直接舍弃)

4、字符转换

public class DEMO4 {  
    public static void main(String[] args) {
		//字符转换
		char e = 'A';  
		int f = e+1;  
		System.out.println(f);  
		System.out.println((char)f);
    }  
}

输出结果为:
66
B

  • char的本质是数字,所以+1这一步相当于自动转换为了高容量的int类型。
  • 此后再将int强制转换为char,根据Unicode的编码顺序,字母A后面一个字符就成了字母B。

5、溢出问题

public class DEMO5 {  
    public static void main(String[] args) {
		//溢出问题  
		int money = 10_0000_0000;//JDK7开始的特性,数字间加"_"分位,不影响代码执行  
		int years = 20;  
		int total1 = money*years;  
		System.out.println(total1);//内存溢出  
		long total2 = money*years;  
		System.out.println(total2);//内存溢出,不解决问题
		long total3 = money*((long)years);  
		System.out.println(total2);//不再溢出
    }  
}

输出结果为:
-1474836480
-1474836480
20000000000

  • 计算大数据的时候要注意溢出问题。

  • long total2的问题在于,money*yearsint数据,计算完成时已经数据溢出,再转换为long于事无补。

  • ((long)years)会将数据强制转换为long,再乘以money,计算结果依旧会是long类型数据,所以不再溢出。

  • long类型数据末尾要加L,虽然大小写都可以,但为了避免读写失误,尽量使用大写而不用小写。