引用类型变量的强制转换

来源:互联网 发布:sugarhosts 知乎 编辑:程序博客网 时间:2024/05/18 04:00
编写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的父类 }}

原创粉丝点击