引用类型变量的强制转换

五迷三道 提交于 2020-02-08 07:33:49

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

引用类型之间的转换只能把一个父类变量转换成子类类型。如果试图把一个父类实例转换成子类类型,则必须这个对象实际上是子类实例才行(即编译时类型为父类类型,运行时为子类类型),否则会发生ClassCastException异常。
 
public class Test {
     public static void main(String[] args) {

         Object o1=new Object();            //o1的编译类型是Object,实际类型是Object,是string的父类,所以可以强制转换成string类

         String o2=new String();             //o2的编译类型是String,实际类型是String

         Object o3=new String();            //o3的编译类型是Object,实际类型是String

         o2=(String)o1;                          //编译时没错,运行时有错(o2和o1的实际类型不一样)

        o2=(String)o3;                           //编译时没错,运行时没错(o2和o3的实际类型一样)

        o3=(String)o1;                          //编译时没错,运行时有错(o1和o3的实际类型不一样)

        o3=o1;                                     //编译时没错,运行时也没错
     }
}
 
 
    在强制转换之前可以先用instanceof来判断是否可以成功转换,instanceof 的前一个操作数通常是引用类型变量,后一个通常是类。它用于判断前面的对象是否是后面的类或其子类的实例,如果是返回true否则返回false。instanceof前面的操作数的编译类型要么与后面的类相同,要么是后面类的父类,否则会发生编译错误。

public class Test {

 
 public static void main(String[] args) {
     Object a1=new String();
   System.out.println(a1 instanceof Object);       //返回true
   System.out.println(a1 instanceof String);    //返回true
 
   System.out.println(a1 instanceof Math);    //返回false,math是object的子类
   System.out.println(a1 instanceof Comparable);  //返回true,string实现了comparable接口

   String a2=new String();
   System.out.println(a2 instanceof Math );    //编译错误因为a2不是math类,也不是math的父类
 }

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!