黑马程序员技术交流社区

标题: 一道关于多态的题目表示不懂 [打印本页]

作者: 张豪杰    时间: 2013-2-28 20:51
标题: 一道关于多态的题目表示不懂
本帖最后由 张豪杰 于 2013-3-5 23:54 编辑

下面这道多态的题目不是很理解,求解答
  关于父类和子类,下列说法不正确的是:
1.变量可以调用的方法必须是该变量类型的成员
2.包含子类对象的引用的父类类型变量会调用父类方法
3.将父类对象的引用赋值给子类类型的变量会产生编译错误
我认为是1是错的,怎么答案是3错误啊?????求解!!!
作者: 罗海云    时间: 2013-2-28 21:18
3. 将超类对象的引用赋值给子类类型的变量会产生编译错误。
答:这句话也就是说类似于这样Child c = new Father();如果不使用强制类型转换,可能会出现编译错误。如果Child c = (Child)new Father();可能不会。因为几乎没有人这么用。原因是由于出现类似于‘对象切片’的原因,把父类对象赋值给子类的变量,而父类对象不具有子类中的属性。所以这样一个子类变量也不可能拥有调用自己类中定义的变量的权利和内存空间。就算是编译不错,也只能访问父类对象所占用的那么大一块堆空间中的数据。所以对于强类型的语言来说,不管是RTTI机制还是强制类型转换,还是对象的下转型、上转型对象,主要还是内存模型的问题。说到JVM中就是在维护的一张和类,对象有关的表的索引问题。JAVA语言没有指针,叫引用(Reference)。在JVM中使用的是另外一个名称类似于指针,其实类似于基址+变址+偏址 寻址。而这个引用充当相当于这个偏址。所以它没有把引用叫做指针。指针是内存的决对位置。引用是一个相对位置。
作者: 李红志    时间: 2013-3-4 17:39
3不正确
例如:Map hp=new HashMap();是不会出现编译错误的
多态:简单理解,多种状态 ,例如一个人,有两个或者多个形态,男人,女人,正太...
我们在创建一个人的时候,可以用人这个大的框架,然后再付给他确切的形态.
例如Human m=new Man();创建一个人,并赋给他男人的形态.
作者: 曹春贵    时间: 2013-3-4 17:59
额,慢慢学习视频吧。以后练习多了就会理解的
作者: HM王琦    时间: 2013-3-5 23:40
3错误,因为父类创建时,还没有子类。父类对象的引用赋值给子类类型的变量
例如:动物是父类,狗是子类。
将父类对象的引用赋值给子类类型的变量 即将一个动物赋值给狗。违背了自然规律。因为动物不一定是狗。
但反过来说就是对的,即将子类对象的引用赋值给父类类型的变量 即狗赋值给动物。因为狗一定是动物。
这就是多态





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2