数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。
自动转换
布尔型和其它基本数据类型之间不能相互转换
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低--------------------------------------------->高
byte,short,char-> int -> long -> float -> double
运算中,不同类型的数据先转化为同一类型,然后进行运算,转换规则如下:
操作数1类型 | 操作数2类型 | 转换后的类型 |
---|---|---|
byte、short、char | int | int |
byte、short、char、int | long | long |
byte、short、char、int、long | float | float |
byte、short、char、int、long、float | double | double |
- 在算数运算中,除了按上表的自动转换外,byte short char运算会转换为Int;
基本数据的类型在平时写代码中很常见了,比如调用方法时的参数传递。再举个小例子:
double i = 1/3;
double j = 1.0/3;
System.out.println(i); // 0.0
System.out.println(j); // 0.3333333333333333
这是因为,1/3
两个操作数都为int
,则运算结果也为int
,1
整除3
结果为0
,0
再转换为double
则为0.0
,因此i=0.0
;而1.0/3
,操作数一个为double
,一个为int
,运算结果为double
,因此j= 0.3333333333333333
。
强制转换
自动转换是有规则的(从小到大),如果不想遵守这种规则,从大到小,从高到低,就需要强制换了。
- 条件是转换的数据类型必须是兼容的。
- 格式:
(type)value
,type
是要强制类型转换后的数据类型。
举例:
int a = 97;
System.out.println((char) a); // a
字符a
的十进制Unicode码为97
.
引用类型转换
上面的自动转换和强制转换的规则对引用类型的转换也适用,从小到大,父类为大,子类为小。
- 自动转换:向上类型转换,是小类型到大类型的转换,即把子类类型对象赋给父类类型变量;
- 强制转换:向下类型转换,是大类型到小类型的转换,即把父类类型对象赋给子类类型变量。
其实就是一个很简单的道理,猫是动物(自动转换),动物却不一定是猫(不能自动转换)。
- 举例:
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public class Cat extends Animal{
public Cat(String name) {
super(name);
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
}
- 自动转换:
Animal cat = new Cat("喵"); //自动转换 让动物变量cat为猫
Cat cat1 = new Cat("喵喵");
Animal cat2 = cat1; // 自动转换 让动物变量cat为猫
System.out.println(cat.getName()); // 喵
System.out.println(cat2.getName()); // 喵喵
- 强制转换
Cat cat = new Cat("喵");
Animal cat1 = cat;
Cat cat2 = (Cat) cat1;
Dog dog = (Dog) cat1;
System.out.println(cat2.getName()); // 喵
System.out.println(dog.getName()); // Error:(10, 25) java: 不兼容的类型: Cat无法转换为Dog
上面说到,强制转换也是有条件的:转换的数据类型必须是兼容的,因此Cat无法转换为Dog。
另外,java也可以利用instanceof
关键字判断是一个实例对象是否属于一个类,是返回true
,否则返回false
。
语法:
实例 instanceof 类
要说明的一点是,强制类型因为是从大到小的转换,因此存在风险,可能会精度丢失或内存溢出。