为什么在对象向下转型前必须先发生向上转型?
即为什么第一个代码正确,第二个错误?
class A{ // 定义类A
public void fun1(){ // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
}
public void fun2(){
this.fun1() ; // 调用fun1()方法
}
};
class B extends A{
public void fun1(){ // 此方法被子类覆写了
System.out.println("B --> public void fun1(){}") ;
}
public void fun3(){
System.out.println("B --> public void fun3(){}") ;
}
};
正确的
public class Demo01{
public static void main(String asrgs[]){
A a = new B() ; // 向上转型关系
B b = (B)a ; // 发生了向下转型关系
b.fun1() ;
b.fun2() ;
b.fun3() ;
}
};
错误的
public class Demo02{
public static void main(String asrgs[]){
A a = new A() ; // 实例化了一个父类对象
B b = (B)a ; // 发生了向下转型关系
b.fun1() ;
b.fun2() ;
b.fun3() ;
}
}; 作者: ①人←①城市 时间: 2013-4-14 12:31 本帖最后由 ①人←①城市 于 2013-4-14 12:36 编辑
A a = new B() ;这个时候是明显告诉A,我有个子类是B.所以是正确的.
A a = new A() ;这个时候A是不知道有个子类B.所以是错误的.
只有B才知道自己的父类是A.