关于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 ;
}
};
经过编译,可知程序段二是错误的,请谁帮我讲解一下。 展开
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 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的相关方法(呵呵,开始就这样简单理解),这样是允许的,
程序二,则是根本就是把大的转换成小的,这样做不行
由你的代码来看,B类继承了A类,这个继承的概念知道吧!既然知道这个东西,我们就可以理解B继续了A类的所有非私有的东西,这一点要明白,父类允许有自己的东西,如果只允许是自己的,那么子类始终不会拥有这个方法的使用权.
另外一点要记住(可以帮助你很快记住这个类型转换的东西):
在类型转换时,“大”类型不可以转换为"小"类型的来使用,“小”类型当然可以转换为“大”类型,这里面的大小关系就是继承关系中的父与子类
父--------"大",即使A a=new B();这个变量a仍然是属于B的,只是a也想拥有A的相关方法(呵呵,开始就这样简单理解),这样是允许的,
程序二,则是根本就是把大的转换成小的,这样做不行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
面向对象中你记住 父类存在的地方子类都能存在,换句话说任何子类都能转换为其父类,但是父类不能转换为子类
在你的程序中A为父类 B为子类
程序1中,你定义了A a = new B(), B b = (B)a ;就没有问题。
程序2中,你定义了A a = new A() ;B b = (B)a这句代码是有问题的,父类是无法转换为子类的
在你的程序中A为父类 B为子类
程序1中,你定义了A a = new B(), B b = (B)a ;就没有问题。
程序2中,你定义了A a = new A() ;B b = (B)a这句代码是有问题的,父类是无法转换为子类的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
个人愚见:
程序段1中的a是父类类型的引用指向子类的对象,所以可以转化为B类型
程序2中的a是父类类型的一个对象,不能转化为B类型。
儿子的要比父亲的高级,低的不能当高的用,高的可以当低的用。就是大箱子,小箱子的问题
程序段1中的a是父类类型的引用指向子类的对象,所以可以转化为B类型
程序2中的a是父类类型的一个对象,不能转化为B类型。
儿子的要比父亲的高级,低的不能当高的用,高的可以当低的用。就是大箱子,小箱子的问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询