黑马程序员技术交流社区

标题: 贴标签思想秒懂多态问题 [打印本页]

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

作者: 守望の希望    时间: 2016-11-19 15:24
楼主很

作者: 继续敲代码    时间: 2016-11-19 19:19
个人觉得楼主的见解很好

作者: 闪客sun    时间: 2016-11-19 19:38
继续敲代码 发表于 2016-11-19 19:19
个人觉得楼主的见解很好

谢谢!一起加油!

作者: lieyemu    时间: 2016-11-19 22:38
6666666666666




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