scjp考试准备

题目为如下代码的执行结果:

class Building{}

public class Barn extends Building{
    
      public static void main(String[] args){
            Building build1 = new Building(); 
            Barn barn1 = new Barn(); 
            Barn barn2 = (Barn)build1; 
            Object obj1 = (Object)build1; 
            String str1 = (String)build1; 
            Building build2 = (Building)barn1; 
      }

}

题目考试的点是引用类型的强制转换。引用类型的强制类型转换有以下需要注意的点:

1. 引用类型的转换只能在具有继承关系的两个类之间进行。如果两个类之间不具有继承关系则会在编译时报“不可类型转换”的错误。

2. 若将子类对象强制转为父类类型,那么被转换的子类型对象的编译时类型被转为父类型,但其运行时类型仍然是子类型。

3. 如果把要把父类型的变量转换为子类型,一般要求这个对象是子类型实例(编译时类型是父类型,运行时类型是子类型)。否则虽然编译时可以通过,但是在执行时会报出ClassCastException异常。

4. 对于3中的情形, 在强制类型转换前,使用instanceof运算符进行判断。instanceof运算的前一个操作数通常是一个引用类型变量,后一个操作数一般为一个类或接口,比如“barn1 instanceof Barn”。instanceof用于判断前面的对象是否是后面的类(或其子类、实现类)的实例。

5. 使用instanceof运算符需要注意一点,就是instanceof运算符前面的操作数的编译时类型要么与后面的类相同,要么具有继承关系,不然在编译时就会报“不可转换的类型”错误。

根据第一点,可知上面的这道题在编译时会报错。问题就出在“String str1 = (String)build1; ”这一行。

原文地址:https://www.cnblogs.com/amunote/p/3948039.html