声明一个父类,然后让其指向子类,这个过程为向上转型,属于自动类型转换,不会报错。
声明一个子类,然后让其指向父类,这个过程为向下转型,需要强制类型转换,否则报错。
不管一个对象正在被父类管理还是子类管理,只能调用其当前管理者的方法。
注释:啥是管理者?比如String a = "hello",那么a就是这个字符串当前的管理者。
示例如下:
public class TestCasting {
public static void main(String[] args) {
Object obj = new String("我是一个字符串"); //向上可以自动转型
//obj.charAt(0); 由于编译器认为obj是Object类型而不是String类型,因此这条语句不可执行。
String str = (String) obj; // 向下转型
System.out.println(str.charAt(0)); // 位于0索引位置的字符
System.out.println(obj == str); // true.他们俩运行时是同一个对象
}
}
结果如下:
我
true
向下转型时,必须转型成其子类,否则会有类型转换异常ClassCastException。
示例如下:
public class 测试 {
public static void main(String[] args) {
Object obj = new String("我是一个字符串");
//真实的子类类型是String,但是此处向下转型为StringBuffer
StringBuffer str = (StringBuffer) obj;
System.out.println(str.charAt(0));
}
}
结果如下:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.StringBuffer
at 测试.main(测试.java:5)
使用instanceof运算符来判断对象的真实类型。
示例如下:
public class TestCasting3 {
public static void main(String[] args) {
Object obj = new String("我是一个字符串");
if(obj instanceof String){
String str = (String)obj;
System.out.println(str.charAt(0));
}else if(obj instanceof StringBuffer){
StringBuffer str = (StringBuffer) obj;
System.out.println(str.charAt(0));
}
}
}
结果如下:
我