J2SE

程序段一:
class A{};
class B extends A{};
public class C{
 public static void main(String args[]){
 A a = new B() ; //不同之处
 B b = (B)a ;
 }
};
程序段二:
class A{};
class B extends A{};
public class C{
 public static void main(String args[]){
 A a = new A() ; //不同之处
 B b = (B)a ;
 }
};



最佳答案程序2报错是因为
B b = (B)a ;这句话。父类给子类赋值。向下转型,所以报错

而程序1没报错是因为  A a = new B() ; 这里初始化的时候发生过向上转型
之后在向下转型所以不会出错

向下转型只有曾经发生过向上转型才可以向下转。

就像你的程序一中的:
A a = new B() ; //直接用子类构造实例化父类对象
                    相当于B b =new B();
                          A a =b;
B b = (B)a ;    //如上,只有是从B类型对象转到A类型对象的
                    这个时候A的对象才能转回来

而向上转型则是子类赋值给父类自动转的。

对象的向上向下转型体现了对象的多态性。

方法的重载和覆写也能说明java的多态性。


我还是喜欢用最通俗的话向别人讲解东西!

由你的代码来看,B类继承了A类,这个继承的概念知道吧!既然知道这个东西,我们就可以理解B继续了A类的所有非私有的东西,这一点要明白,父类允许有自己的东西,如果只允许是自己的,那么子类始终不会拥有这个方法的使用权.
另外一点要记住(可以帮助你很快记住这个类型转换的东西):
在类型转换时,“大”类型不可以转换为"小"类型的来使用,“小”类型当然可以转换为“大”类型,这里面的大小关系就是继承关系中的父与子类

父--------"大",即使A a=new B();这个变量a仍然是属于B的,只是a也想拥有A的相关方法(呵呵,开始就这样简单理解),这样是允许的,

程序二,则是根本就是把大的转换成小的,这样做不行

你可能感兴趣的:(C++,c,J2SE,C#)