关于java中的对象多态性

程序段一:classA{};classBextendsA{};publicclassC{publicstaticvoidmain(Stringargs[]){Aa=new... 程序段一:
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 ;
}
};

经过编译,可知程序段二是错误的,请谁帮我讲解一下。
展开
 我来答
liu__huan
2009-07-13 · TA获得超过1064个赞
知道小有建树答主
回答量:279
采纳率:0%
帮助的人:323万
展开全部
程序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的多态性。
狄十肆Bp
2009-07-13 · TA获得超过194个赞
知道小有建树答主
回答量:123
采纳率:0%
帮助的人:81.5万
展开全部
我还是喜欢用最通俗的话向别人讲解东西!

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

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

程序二,则是根本就是把大的转换成小的,这样做不行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
alex5v5v
2009-07-13 · TA获得超过270个赞
知道小有建树答主
回答量:225
采纳率:0%
帮助的人:173万
展开全部
面向对象中你记住 父类存在的地方子类都能存在,换句话说任何子类都能转换为其父类,但是父类不能转换为子类
在你的程序中A为父类 B为子类
程序1中,你定义了A a = new B(), B b = (B)a ;就没有问题。

程序2中,你定义了A a = new A() ;B b = (B)a这句代码是有问题的,父类是无法转换为子类的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小爬爬001
2009-07-13 · TA获得超过1346个赞
知道小有建树答主
回答量:1200
采纳率:0%
帮助的人:629万
展开全部
个人愚见:
程序段1中的a是父类类型的引用指向子类的对象,所以可以转化为B类型
程序2中的a是父类类型的一个对象,不能转化为B类型。
儿子的要比父亲的高级,低的不能当高的用,高的可以当低的用。就是大箱子,小箱子的问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式