强制类型转换
# 前言
在上一个案例中,我们已经知道这是对象的多态,但是现在问一个问题,Man
类中的字段isSmoking
,还存在吗?还在堆内存中吗?要怎么才能调用?
Person p = new Man();
1
存在的,还在堆内存中,只是因为声明引用时,声明的是父类,所以不能调用,实际上实例化对象时,就已经创建了这些字段。
如果需要访问/调用,
那么需要Casting
对象类型转换,也叫强制类型转换/向下转型。
在多态实例化中,子类新增加的属性和方法,父类虽然不能访问,但是它们还在堆内存中,只需要将引用转换为堆内存中跟对象一致的数据类型就可以访问了。
# Casting
对象类型转换
# 语法格式
数据类型 变量名1 = (数据类型)变量名2;
1
比如解决前言中的案例:
Person p = new Man();
Man m = (Man)p;
1
2
2
对于类型转换,可以分为两类:
- 基本数据类型的Casting:
- 自动类型转换:小的数据类型可以自动转换成大的数据类型
- 如longg=20;doubled=12.0f
- 强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型
- 如floatf=(float)12.0;inta=(int)1200L
- 自动类型转换:小的数据类型可以自动转换成大的数据类型
- 对Java对象的强制类型转换称为造型
- 从子类到父类的类型转换可以自动进行
- 从父类到子类的类型转换必须通过造型(强制类型转换)实现
- 无继承关系的引用类型间的转换是非法的
- 在造型前可以使用
instanceof
操作符测试一个对象的类型
# instanceof
操作符
使用强制类型转换是有风险的,比如在基本数据类型中,有可能会丢失精度。
而且还有可能报错:java.lang.ClassCastException
Person p2 = new Man();
Woman w = (Woman) p2;
1
2
2
那么为了解决程序运行正常,不出现异常,我们需要instanceof
操作符。
# API
x instanceof
A:检验x是否为类A的对象,返回值为boolean
型
# 作用
那么上面的代码应该这样写:
Person p2 = new Man();
if(p2 instanceof Woman){
Woman w = (Woman) p2;
}
1
2
3
4
2
3
4
使用情景:为了避免向下转型时出现异常,我们在向下转型之前,先进行instanceof
判断,一旦返回true
,才向下转型,返回false
,就不向下转型。
如果 A instanceof B == true,A instanceof C == true,那么B和C是继承关系。
Person p2 = new Man();
System.out.println(p2 instanceof Man);
System.out.println(p2 instanceof Person);
1
2
3
2
3
true
true
1
2
2
# 最后
实际开发中,我们大多数用的是向上类型转换,很少用向下类型转换,但是你也必须会,因为万一哪一天用到了呢。
帮我改善此页面 (opens new window)
上次更新: 2020/12/18, 12:50:58