类型转换
引言:
java是一门强类型的语言,其中的类型转换分为基本类型转换和强制类型转换,接下来和大家探讨一下转换的注意事项:
一、自动类型转换
1.基本数据类型的自动转换
首先提一下自动类型转换,对于基本类型来说,就是把范围小的数据类型转换为范围大的数据类型。
基本数据类型自动转换
//int --> float
float f = 12;
System.out.println(f);
//float --> double
double d = 12.8F;
System.out.println(d);
这里不推荐使用,即使是范围小的类型转换为范围大的类型,也会出现丢失精度问题,如下代码:
float f1 = 12.8F; //12.8 System.out.println(f1); //float --> double double d = f1; //12.800000190734863 System.out.println(d);
可以看出float --> double,存储的数据不一致
2.引用数据类型的自动转换
对于引言数据类型来说,就是父类的引用指向子类或者间接子类的对象,或是接口的 引言数据类型指向遵从接口实现类对象【多态】,这也称为向上转型,这种转换是天生安全的。
引用类型的自动转换【向上转型】
class Animal {}
class Monkey extends Animal {}
/**
* @Author: renlon
* @Date: 2023/02/27/17:40
*/
public class Demo {
//父类引用指向子类的对象【多态】
Animal animal = new Monkey();
}
二、强制类型转换
强制类型转换就是把范围大的数据类型转换为范围小的数据类型。
java中的强制类型转换分为基本类型的强制转换和引用类型的强制转换。我们不推荐基本基本类型的强制转换,因为会出现精度的损失。而对于引用数据类型的强转,只要满足真实数据类型与目标数据类型一致,大胆转,不会出现精度丢失,内存丢失的问题。
1.基本类型的强转
这种转换基本不建议使用,因为会出现精度损失和溢出的情况。
语法格式:
范围小的数据类型 变量名 = (范围小的数据类型)范围大的数据类型;
案例:
/**
* 没有精度损失和溢出
*/
int a1 = 12;
int a2 = 23;
byte b1 = (byte) (a1 + a2); //35
System.out.println(b1);
/**
* 出现了溢出
*/
int a3 = 68;
int a4 = 67;
byte b2 = (byte) (a3 + a4); //-121
System.out.println(b2);
/**
* 精度损失
*/
double d = 3.14 - 3.12;
float f = (float) d;
System.out.println(d); //0.020000000000000018
System.out.println(f); //0.02
上面的代码案例很容易看出基本类型强转的精度损失和溢出问题,所以也建议使用。
2.自动强转的情况
这里引入一个问题,如何将大写字母转换成小写字母。
public class Demo1 {
public static void main(String[] args) {
char ch = 'A';
// ch = ch + 32; 错误方法,
/**
* 第一种(错误形式)
* 32 默认为int类型,ch + 32计算机会默认当前类型为int
* 把int类型的变量赋值给char,会报错
*/
ch += 32; //正确
//自带特殊功能,可以满足类型转换的需求。
ch += ('a' - 'A'); //标准形式(严格遵守类型一致化要求)
}
}
3.引用类型的强转
引用类型的强转也称为向下转型,
class Animal {
}
class Monkey extends Animal {
}
class Cat extends Animal {
}
/**
* @Author: renlon
* @Date: 2023/02/27/17:40
*/
public class Demo {
public static void main(String[] args) {
//父类引用指向子类的对象【多态】
Animal animal = new Monkey();
//强转,也称向下转型
Monkey monkey = (Monkey) animal;
//错误强转(类型不一致)
Cat cat = (Cat) animal; //ClassCastException
}
}
上图是引用数据类型强转的图示,首先声明父类引用指向子类对象,强转成Monkey类型相当于讲animal对象的地址赋值给monkey。
由上面的案例可以看出,引用数据类型的强转,只要真实的数据类型满足和目标数据类型一致,那么在强转的过程中不会涉及到数据丢失,精度丢失,内存丢失的问题。如果精度不一致,那么强转会导致ClassCastException(类型转换异常)