java中类型转换包括两种:
- 隐式转换(自动类型转换):对于将小范围的数据类型转换为大范围数据类型,将执行自动类型转换,不需要类型转换操作符。
- 显示转换(强制类型转换):将大范围数据类型转换为小范围数据类型,可能会造成数据丢失或精度损失,这时编译器会强制我们进行类型转换。
一、基本类型
1. 基本类型之间
对于基本类型之间数据转换,其数据确实发生了变化。
- 向下转换:将大范围的数据类型转换为小范围数据类型,可能会发生数据丢失或精度丢失。转换规则如下:
- 数值型数据的转换:byte→short→int→long→float→double。
- 字符型转换为整型:char→int。
- 向上转换:将小范围数据类型转为大范围数据类型,不会造成信息丢失。
2. 基本类型与包装类型
基本类型与包装类型之间的转换,比如Integer,实际是通过Integer.parseInt()
和Integer.valueOf()
来进行转换的。
二、引用类型
对于引用类型的转换,必须要有继承关系才可以进行转换。
1. 引用类型类型转换实质
对于引用类型的数据转换,实际上只是引用名义类型的转换,具体对象类型不会发生变换。 如下面代码所示:将TestToString
类对象赋值给Object引用对象,但执行ToString
方法的,仍然是TestToString
类对象
java
public class TestToString {
@Override
public String toString(){
return "test";
}
}
public class Main {
public static void main(String[] args) {
Object object = test;
System.out.println(object.toString());
}
}
// test
// test
2. 父转子
对于父类对象转子类对象,要区分两种情况:
- 父类对象实际指向子类对象,允许转换
- 父类对象实际引用的就是父类对象,会报类型转换异常
java
public static void main(String[] args) {
// 情况1:父类对象实际指向子类对象
Father father1 =new Son();
Son son = (Son)father1;// 允许
// 情况2:父类对象实际指向父类对象
Father father2 =new Father();
Son son2 = (Son)father2;// ClassCastException
}
3. 子转父
对于子类对象转为父类对象,也就是向上转型,是可以通过编译并正常运行的。