编写java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用对象确实包含该方法。
引用类型之间的转换只能把一个父类变量转换成子类类型。如果试图把一个父类实例转换成子类类型,则必须这个对象实际上是子类实例才行(即编译时类型为父类类型,运行时为子类类型),否则会发生ClassCastException异常。
public class Test {
public static void main(String[] args) {
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的父类
}
}
来源:https://www.cnblogs.com/wyl-study/archive/2012/01/21/2328603.html