先总结:
向下转型时,只能将一个变量转化成其 “实例对象”或者 “实例对象的父类”。
例如:
F f = new S();
将 f转化成 S类型或者 S的父类型(哪怕都是f的父类)都没问题;此外就会报出运行异常**
1.父类对象引用子类实例,该对象无法获取子类特有方法,但向下转型后便可:
public class Demo {
public static void main(String[] args) {
A a= new B(); //父类对象引用子类实例
a.funB(); //编译不通过,因为看左用右
((B)a).funB(); //向下转型后,可正常运行
}
}
interface A {
public void speak() ;
}
class B implements A {
public void speak() {
System.out.println("implement A in B");
}
public void funB() {
System.out.println("special method in B");
}
}
class C implements A {
@Override
public void speak() {
System.out.println("implement A in C");
}
public void funC(){
System.out.println("special method in C");
}
}
2.父类对象引用子类实例,如果将对象转成同级其他实例或者低级实例,编译可过,但运行出现异常java.lang.ClassCastException
public class Demo {
public static void main(String[] args) throws UnsupportedEncodingException {
A a = new B(); //a对象指向B的实例
((C)a).funC(); //将a对象转化成同B一样等级的对象
((D)a).funD(); //将a对象转化成B的子对象
//以上都会报出java.lang.ClassCastException
}
}
interface A {
public void speak() ;
}
class B implements A {
public void speak() {
System.out.println("implement A in B");
}
public void funB() {
System.out.println("special method in B");
}
}
class C implements A {
@Override
public void speak() {
System.out.println("implement A in C");
}
public void funC(){
System.out.println("special method in C");
}
}
class D extends B {
public void funD() {
System.out.println("special method in D");
}
}
3.如果向下转成实例对象的父对象,则不会有问题
A a = new D();
((B)a).funB(); //转成父类型