public class InstanceofTest {
public static void main(String[] args) {
Object str = "Java对象";
Math math = (Math)str; //①
System.out.println("字符串是否是String的实例:" + (math instanceof String)); //② 报错:Incompatible conditional operand types Math and String
}
}
public class ConversionTest {
public static void main(String[] args) {
Object obj = "Hello"; //obj编译时类型是Object,运行时类型是String。
String objStr = (String)obj; //因为obj编译时类型是Object,所以可以通过编译。因为obj运行时类型是String,objStr也是String类,所以可以运行。
System.out.println(objStr);
Object objPri = new Integer(5); //objPri编译时类型是Object,运行时类型是Integer。
String str = (String)objPri; //因为objPri编译时类型是Object,所以可以通过编译。因为obj运行时类型是Integer,objStr是String类,所以会引发异常。
System.out.println(str);
String s = "Java对象"; //s编译时类型和运行时类型都是String。
Math m = (Math)s; //String类不是Math的子类,也不是Math的父类,所以会导致编译错误。
}
}
关于instanceof还有一个比较隐蔽的陷阱。
public class NullInstaceof {
public static void main(String[] args) {
String s = null;
System.out.println("null是否是String类的实例:" + (s instanceof String));
}
}