Skip to content

java中类型转换包括两种:

  • 隐式转换(自动类型转换):对于将小范围的数据类型转换为大范围数据类型,将执行自动类型转换,不需要类型转换操作符。
  • 显示转换(强制类型转换):将大范围数据类型转换为小范围数据类型,可能会造成数据丢失或精度损失,这时编译器会强制我们进行类型转换。

一、基本类型

1. 基本类型之间

对于基本类型之间数据转换,其数据确实发生了变化。

  1. 向下转换:将大范围的数据类型转换为小范围数据类型,可能会发生数据丢失或精度丢失。转换规则如下:
    • 数值型数据的转换:byte→short→int→long→float→double。
    • 字符型转换为整型:char→int。
  2. 向上转换:将小范围数据类型转为大范围数据类型,不会造成信息丢失。

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. 子转父

对于子类对象转为父类对象,也就是向上转型,是可以通过编译并正常运行的。