自动转换和强制转换
2019-02-16 本文已影响1人
竹鼠不要中暑
数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。
自动转换
布尔型和其它基本数据类型之间不能相互转换
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低--------------------------------------------->高
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 类
要说明的一点是,强制类型因为是从大到小的转换,因此存在风险,可能会精度丢失或内存溢出。