A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张豪杰 中级黑马   /  2013-2-28 20:51  /  1274 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张豪杰 于 2013-3-5 23:54 编辑

下面这道多态的题目不是很理解,求解答
  关于父类和子类,下列说法不正确的是:
1.变量可以调用的方法必须是该变量类型的成员
2.包含子类对象的引用的父类类型变量会调用父类方法
3.将父类对象的引用赋值给子类类型的变量会产生编译错误
我认为是1是错的,怎么答案是3错误啊?????求解!!!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
3. 将超类对象的引用赋值给子类类型的变量会产生编译错误。
答:这句话也就是说类似于这样Child c = new Father();如果不使用强制类型转换,可能会出现编译错误。如果Child c = (Child)new Father();可能不会。因为几乎没有人这么用。原因是由于出现类似于‘对象切片’的原因,把父类对象赋值给子类的变量,而父类对象不具有子类中的属性。所以这样一个子类变量也不可能拥有调用自己类中定义的变量的权利和内存空间。就算是编译不错,也只能访问父类对象所占用的那么大一块堆空间中的数据。所以对于强类型的语言来说,不管是RTTI机制还是强制类型转换,还是对象的下转型、上转型对象,主要还是内存模型的问题。说到JVM中就是在维护的一张和类,对象有关的表的索引问题。JAVA语言没有指针,叫引用(Reference)。在JVM中使用的是另外一个名称类似于指针,其实类似于基址+变址+偏址 寻址。而这个引用充当相当于这个偏址。所以它没有把引用叫做指针。指针是内存的决对位置。引用是一个相对位置。
回复 使用道具 举报
3不正确
例如:Map hp=new HashMap();是不会出现编译错误的
多态:简单理解,多种状态 ,例如一个人,有两个或者多个形态,男人,女人,正太...
我们在创建一个人的时候,可以用人这个大的框架,然后再付给他确切的形态.
例如Human m=new Man();创建一个人,并赋给他男人的形态.
回复 使用道具 举报
额,慢慢学习视频吧。以后练习多了就会理解的
回复 使用道具 举报
3错误,因为父类创建时,还没有子类。父类对象的引用赋值给子类类型的变量
例如:动物是父类,狗是子类。
将父类对象的引用赋值给子类类型的变量 即将一个动物赋值给狗。违背了自然规律。因为动物不一定是狗。
但反过来说就是对的,即将子类对象的引用赋值给父类类型的变量 即狗赋值给动物。因为狗一定是动物。
这就是多态
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马