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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闪客sun 初级黑马   /  2016-11-19 13:55  /  767 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

初学Java有一段时间了,渐渐有了点心得体会。Java之所以难,难在它与众不同的面 向对象思想,而Java之所以又简单,也是简单在这个思想十分贴近生活。所以在学习 某些Java的思想和规定时,万万不可死记硬背,用实际生活的常识去理解往往能得心 应手。
正如多态这一块,我想把我对多态的理解分享给大家,我给这种理解方式取名 为贴标签法。
多态即是父类引用指向子类对象,如Animal a=new Dog();这句话可以理解成,一只 名字叫做a的狗,身上贴了一个“动物类”的标签。程序跑起来需要经过两道门,第 一道门叫做“编译”,第二道门叫做“运行”。编译门只会看你身上的标签,和这个 标签所代表的事物是否可以做你要我做的事情;运行门则命令你开始做程序员要你做 的事情。
很简单,第一种情况:如果你写了一条语句 a.吃饭(),当经过编译门时,编译门会 看到你身上贴了一个“动物类”标签,又看到动物这个类可以完成“吃饭”这个方法 ,好的这道门你就可以顺利通过了。当经过运行门时,就会叫a开始“吃饭”,而作 为一只属于动物类的狗,的确可以吃饭,好的那运行门也可以顺利通过了。
第二种情况:a.看家();还是一样,当经过编译门时,它会看到你身上贴了一个“动 物类”标签,但是发现动物类里并没有“看家”这个方法。即使你实际上是一只狗的 确会“看家”,但编译门只能看到你身上的标签,它只能告诉你我只知道你是个动物 ,我并不确定你是否是一只狗,所以对不起,编译失败。
第三种情况:((Dog)a).看家();这句话代表动物类a向下转型为狗类,可以理解成我 撕下了你身上“动物类”这个标签,给你贴了一个“狗类”的标签。你实际上就是只 狗,身上又贴了一个“狗类”的标签,容易理解,编译和运行都是可以通过的。
第四种情况:((Cat)a).抓老鼠();这种情况较为有趣,这相当于在一只狗的身上贴 了一个“猫类”的标签。那么这时编译门仍然是看你的标签,你告诉我你是个猫,而 猫会抓老鼠,所以编译通过。而到了运行门的时候,你必须去做抓老鼠这个动作了, 而这时你再也无法隐瞒自己就是只狗的事实,并没有办法去“抓老鼠”,所以运行失 败。
调用属性(成员变量)时,记住它永远跟着你的标签走,而不管你实际上到底是什么 。属性被写在了你的标签上。
作为参数传递进方法的多态形式依然可以用这种方式去理解,void method(Animal  a){ a.叫();}。这个方法要求你传给我一个贴着“动物类”标签的对象(甚至你贴 一个“狗类”的标签你都无法进来),不管你是狗是猪还是什么,只要你贴了动物类 标签,你就可以通过我的编译门。至于运行的时候,你就需要揭开真面目了,你是一 只狗,就会发出狗叫。你是一只猪,就会发出一声猪叫。
用这种贴近生活常理的理解方式,你就再也不用死记编译看哪边运行看哪边,向上转 型向下转型到底什么时候编译出错什么时候又是运行出错啦!
菜鸟的一点小见解,大神们轻喷,程序员朋友们愿共勉!
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端

4 个回复

倒序浏览
回复 使用道具 举报
个人觉得楼主的见解很好
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
继续敲代码 发表于 2016-11-19 19:19
个人觉得楼主的见解很好

谢谢!一起加油!
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
6666666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马