5.7.2 引用变量的强制类型转换

5.7.2 引用变量的强制类型转换

引用变量只能调用编译时类型中定义的方法

编写Java程序时,引用变量只能调用它编译时类型中定义的方法,而不能调用它运行时类型中定义的方法,即使它实际所引用的对象确实包含该方法。

如果需要让这个引用变量调用它运行时类型定义的方法,则必须把它强制类型转换成运行时类型,强制类型转换需要借助于类型转换运算符

类型转换符是什么

类型转换运算符是小括号,类型转换运算符的用法是:(type) variable,这种用法可以将variable变量转换成一个type类型的变量。

  • 类型转换运算符可以将一个基本类型变量转换成另一个类型。
  • 类型转换运算符还可以将一个引用类型变量转换成其子类类型
    这种强制类型转换不是万能的,当进行强制类型转换时需要注意
  1. 基本类型之间的转换只能在数值类型之间进行,这里所说的数值类型包括整数型字符型浮点型。但**数值类型布尔类型之间不能进行类型转换**。
  2. 引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时就会出现错误。如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型是子类类型),否则将在运行时引发ClassCastException异常。

instanceof运算符

在进行强制类型转换之前,先用instanceof运算符判断是否可以成功转换,从而避免出现ClassCastException异常,这样可以保证程序更加健壮

向上转型

当把子类对象赋给父类引用变量时,被称为向上转型(upcasting),这种转型总是可以成功的,这种转型只是表明这个引用变量的编译时类型是父类,但实际执行它的方法时,依然表现出子类对象的行为方式。

把一个父类对象赋给子类引用变量时,就需要进行强制类型转换,而且还可能在运行时产生ClassCastException异常,使用instanceof运算符可以让强制类型转换更安全。