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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 朴日男 于 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();
      }
}





评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

8 个回复

倒序浏览
这个是我很早之前学习到“多态”时候整理的笔记。
送你了!希望对你有用!
因为字数限制,只能上传附件了。相信楼主看完能深入的理解

新建文本文档.zip

5.45 KB, 下载次数: 332

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

感谢, 总结的部分很好...:)
回复 使用道具 举报
水竹 发表于 2014-9-30 17:53
问题不是出在内存机制,问题出在面向对象;
严格按照面向对象的思想去思考就好了,不管内存中具体是怎么实 ...

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

好吧 -0 - 只能记规则了,,,谢谢
回复 使用道具 举报
向上转型了隐藏了子类的特有方法,所以a.catchMOuse()是错的!
回复 使用道具 举报
不系之舟王 来自手机 中级黑马 2014-10-1 08:53:08
9#
意外的收获,沙发的分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马