数据类型转换
任何一个数据都存在一个默认类型
① 整数默认为int类型
② 浮点数默认为double类型
基本数据类型:
① 自动类型转换
a) 小数据类型转大数据类型
b) 自动类型转换(char和short因为值的范围不同不能自动转换),其它都能完成自动转换
c) 如果值的存储超出了范围就会造成溢出
d) long float double只要两个操作数[数据]中有一个是上面类型的,另一个就会被转换成相应类型,并且结果也是该类型
e) 如果2个操作数(包括byte,short,char,int),都将会转换为int类型,并且结果也是int(自动向上转型)
f) Char类型向更高级的类型转换时,会先转换成对应的Asscii编码,再转换成其他类型
h) Char有两个字节,short也有两个字节,但是它们存储范围不一样,导致byte类型不能自动转换成char类型,char和short也不能自动向更高级转换,所以char和byte、short不能相互自动转换。
i) Java只看类型不看值,若是整数值在byte的存储范围内是可以自动转换的
② 强制类型转换
a) 大数据类型转小数据类型
b) 相同存储空间不同类型的值范围不一样(short和char)必须要强制转换
c) 语法结构为:
[较小]数据类型 变量名 = 较小值[较大的类型];
数据类型 变量名 = (数据类型)值;//值可能是更高的类型
d) 强制类型转换在高转低时会存在精度损失,不同类型的转换可能存在精度损失(实际开发要知道被转换的数据要在一个已知的范围内)
引用数据类型
使用多态,而子类拥有自己的特性时,需要还原它的真实类型就需要数据类型转换
a) 子类类型转父类类型:小转大
Cat cat = new TomCat();
b) 父类类型转子类类型:大转小
TomCat tc =(TomCat)cat;
引用数据类型转换注意事项
class Cat{
void eat(){}
}
class TomCat extends Cat{
void say(){}
}
class CoffeeCat extends Cat{
void drink(){}
}
//测试类
class Test {
public static void main(String[] args) {
Cat cat = new Tomcat();
CoffeeCat cc = (CoffeeCat)cat;
cc.drink();
}
}
- 如上代码示例分析;
a) cat可能是传来的参数:在使用的时候不知道存放的是Tomcat,误以为存的是CoffeeCat类型
b) 红色代码使用多态:绿色代码引用类型数据转换:cc.drink();
c) 编译只看类型不看值,如上代码编译都不会有问题!
d) 但是:运行时反应的是真实类型,绿色代码等于要将TomCat 变成 CoffeCat 显然不行! - 因此引用数据类型转换,最好在转换之前先判断类型在转换
- 判断类型的方式
a) 获得运行时类型 Object 中getClass();方法
b) 类型判断运算符 instanceof - 判断类型示例
a) 获得运行时类型 Object 中getClass();方法
class Test {
public static void main(String[] args) {
Cat cat = new TomCat();
String name = cat.getClass().getName();//获取到类型的名字String类型的值
if(name.equals("CoffeeCat")){//比较是否于CoffeeCat字符串一致
CoffeeCat cc = (CoffeeCat)cat;
cc.drink();
}else{
System.out.println("友好提示:小哥哥类型错了");
}
}
}
b) 类型判断运算符 instanceof
//测试类
class Test {
public static void main(String[] args) {
Cat cat = new TomCat();
if(cat instanceof CoffeeCat){
CoffeeCat cc = (CoffeeCat)cat;
}else{
System.out.println("友情提示:小姐姐你的类型错了");
}
}
}
instanceof运算符的运用
Systme.out.println(cat instanceof Cat);//true
Systme.out.println(cat instanceof TomCat);//true
Systme.out.println(cat instanceof Object);//true
Systme.out.println(cat instanceof CoffeeCat);//false
System.out.println(tom instanceof CoffeeCat);//编译报错,不存在继承关系,不兼容,完全相关类型:编译器只看类型不看值
Systme.out.println(cat instanceof String);//编译报错,不存在继承关系,不兼容,完全相关类型:编译器只看类型不看值