引用类型变量的强制转换

编写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的父类
 }

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值