黑马程序员技术交流社区

标题: 关于多态, 父类引用指向子类对象的疑惑~~~ [打印本页]

作者: 朴日男    时间: 2014-9-30 16:16
标题: 关于多态, 父类引用指向子类对象的疑惑~~~
本帖最后由 朴日男 于 2014-9-30 16:30 编辑

abstract class Animal
{
        abstract void eat();
}
class Cat extends Animal
{
        public void eat()
        {
                System.out.println("吃鱼");
        }
        public void catchMouse()
        {
                System.out.println("抓老鼠");
        }
}
public class DuoTaiDemo
{
        public static void main(String[] args)
        {      
                Animal a = new Cat(); /*多态这句好费解啊,,,-0 - ...编译通过 表示代码就没错,,,父类Animal的引用a 指向了 子类Cat的对象,,,那为什么不能使用
a.catchMouse()方法呢???  当然从逻辑上考虑 Animal 并没有 catchMouse() 这个方法, 所以不通过,,,,可是从内存上看 a 里存储的是 new Cat()的首地址
a.catchMouse() 不应该出错...又晕了...理解错了吗? 我觉得问题出在内存机制的理解....求高手解疑惑....*/               
        }        public static void function(Animal a)      {
            a.eat();
      }
}






作者: 杨佳名    时间: 2014-9-30 17:40
这个是我很早之前学习到“多态”时候整理的笔记。
送你了!希望对你有用!
因为字数限制,只能上传附件了。相信楼主看完能深入的理解

新建文本文档.zip

5.45 KB, 下载次数: 332


作者: 水竹    时间: 2014-9-30 17:53
问题不是出在内存机制,问题出在面向对象;
严格按照面向对象的思想去思考就好了,不管内存中具体是怎么实现的,它都是按照面向对象的规则实现的,了解了规则就好了呗,其他的交给编写java虚拟机的人去考虑。
作者: 朴日男    时间: 2014-9-30 18:57
杨佳名 发表于 2014-9-30 17:40
这个是我很早之前学习到“多态”时候整理的笔记。
送你了!希望对你有用!
因为字数限制,只能上传附件了。 ...

感谢, 总结的部分很好...:)
作者: 朴日男    时间: 2014-9-30 19:09
水竹 发表于 2014-9-30 17:53
问题不是出在内存机制,问题出在面向对象;
严格按照面向对象的思想去思考就好了,不管内存中具体是怎么实 ...

当然记规则写代码也行, 就是过不了自己这关,,, 有强迫症 - - || :(
作者: Fightin黑马    时间: 2014-9-30 21:14
多态中父类引用指向子类对象,在编译的时候编译器是找父类的方法,运行时是使用子类的方法
Animal a = new Cat();
a.eat();在编译的时候是找父类有没有eat方法,在运行的时候是找子类(猫类)中的eat方法,这个是动态的
如果父类中没有,那就属于子类特有的方法,你用a.catchMouse()时,因为父类没有这个方法,编译时时看父类,所以编译报错;
如果对a进行强制转换成Cat类后就不会出现编译错误了,是因为你告诉了编译器这是一个Cat类,那编译的时候它就会去找子类中有没有这个方法
Cat b=(Cat)a;
b.catchMouse();这样就没有错误了,和内存没啥关系,主要是多态中,编译和运行是分开的,编译找父类,运行找子类
作者: 朴日男    时间: 2014-10-1 03:13
Fightin黑马 发表于 2014-9-30 21:14
多态中父类引用指向子类对象,在编译的时候编译器是找父类的方法,运行时是使用子类的方法
Animal a = new Ca ...

好吧 -0 - 只能记规则了,,,谢谢
作者: 张业婷    时间: 2014-10-1 08:21
向上转型了隐藏了子类的特有方法,所以a.catchMOuse()是错的!
作者: 不系之舟王    时间: 2014-10-1 08:53
意外的收获,沙发的分享




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