目录
1.数字间的类型转换
(1) 隐式类型转换
(2)显式类型转换(强制类型转换)
2.类对象间的强制转换
(1) 向上转型
(2) 向下转型
将一个类型强制转换成另外一个类型的过程被称为类型转换。
1.数字间的类型转换
在Java中,数字类型之间的转换分为两大类:隐式类型转换(也称为自动类型转换)和显式类型转换(也称为强制类型转换)。
(1) 隐式类型转换
隐式类型转换发生在较小的数据类型被赋值给较大的数据类型时,Java编译器会自动处理这种转换,而不需要程序员显式地指定。这种转换通常不会导致数据丢失,但可能会导致精度下降
示例
int a = 5;
long b = a; // 自动将int转换为long
double c = b; // 自动将long转换为double
(2)显式类型转换(强制类型转换)
显式类型转换发生在程序员需要将一个较大的数据类型转换为较小的数据类型时,或者在不兼容的类型之间进行转换时。这种转换可能会导致数据丢失或溢出,因此必须显式地指定。
示例
double d = 9.78;
int e = (int)d; // 强制将double转换为int,结果为9(小数部分被丢弃)
long f = 123456789012345L;
int g = (int)f; // 强制将long转换为int,结果可能会导致数据溢出,因为int的范围比long小
在上面的示例中,将double
转换为int
会丢失小数部分,而将long
转换为int
可能会导致数据溢出,因为long
类型的值范围比int
大得多。
2.类对象间的强制转换
(1) 向上转型
向上转型是指将子类对象转换为父类对象。这种转换是隐式的,因为父类对象可以引用任何子类对象,这是多态性的基础。
Parent parent = new Child(); // 隐式向上转型
即一个类的句柄可以指向自己类的对象或者自己的子孙后代类的对象
(2) 向下转型
指的是将父类类型的对象引用强制转换为子类类型的对象引用。这种转换是有风险的,只有在确保父类对象实际指向的是子类实例时,才能安全地进行。
ParentClass parentObj = new ChildClass(); // 父类引用指向子类实例(多态)
ChildClass childObj = (ChildClass) parentObj; // 向下转型,前提是parentObj确实指向了ChildClass的实例
注意!!!
如果父类引用没有指向子类实例,而是指向了另一个子类或者就是父类本身的实例,那么在进行向下转型时会抛出ClassCastException
。
ParentClass anotherParentObj = new ParentClass();
ChildClass anotherChildObj = (ChildClass) anotherParentObj; // 这会抛出ClassCastException,因为anotherParentObj不是ChildClass的实例
向下转型常用于多态性场景中,当你想调用子类特有的方法或访问子类特有的属性时,就需要将父类引用转换为子类引用。
void process(ParentClass obj) {
if (obj instanceof ChildClass) {
ChildClass child = (ChildClass) obj;
// 现在可以安全地调用ChildClass的方法或访问其属性
child.childSpecificMethod();
}
}
上述代码表示,当我们定义一个m1方法将类进行强制类型转换时,必须进行判断所传参数是不是强转类型的子类。
面试点:if(s instanceof Child3) 判断是否为子类,在进行向下转型之前,使用
instanceof
关键字进行检查。这可以确保只有在对象确实是目标子类类型时,才进行转换。避免异常发生。