作者andymai (人生只有一次)
看板java
标题Re: [问题] 父变数指到子物件的继承问题
时间Sat Apr 27 16:36:57 2013
※ 引述《Shrugg (泪眼问花花不语)》之铭言:
: 对不起,又碰到观念性问题想不通了,所以藉休息思考时间又来这边寻找温情.嘻
: 请问当程式跑到 Father f = new Son()後,从记忆体来看
: 不是就一个Stack区的变数f指向Heap区的一个Son物件吗?
: 如果这时候执行f.show() 为什麽IntelliSense只能选择父类别里的show()?
: 但是如果父类跟子类同时有定义show(),即使选用的是父类的show()
: 却是显示子类show()的内容呢?
: 从物件来看,父类跟子类会有不同的方法跟成员变数,可以理解是不同的东西
: 但是变数的目的不是存值就是存参照,变数为什麽会有父跟子的区分呢?
: 谢谢.
把 Father 换成 动物
把 Son 换成 鸭子
把 show 换成 走
即:
动物 f = new 鸭子();
定义 f 为动物,而且这个动物是鸭子
而在操作的时候,光看 f 怎麽会知道它是鸭子还是鸟~或是别的动物?
所以当然只能选择父类别(动物)里的 走()
而这个走()的方法~在父类别里面不是有实作~就是有 abstract 要子类别实作
鸭子继承了动物这个类别~也就理所当然有 走() 这个方法
差别在於子类别是否要自己实作
父类别有实作就是用父类别的~除非被子类别覆写掉了
再讲简单一点
现在我有一堆动物~老虎、鸭子、兔子、人...等等
之所以定义成父类别,就是不打算知道那是什麽动物
要牠去哪就去哪~走()就对了!!!
至於这些动物怎麽走()? 当然就要这些动物自己去实作
所以当然是显示子类别的内容...
(除非父类别有实作~而子类别没覆写)
建议原PO可以看看"深入浅出-设计模式"第一章
上面的例子其实比较偏向"介面"
但是个人认为这样说明比较容易理解
通常之所以要弄成父类别和子类别
就是子类别为了要有父类别的"东西"
就像我老爸是李嘉诚~我当然想要继承他的财产和能力
乍看之下很好!!!
可是...有句话叫"父债子偿"
既然继承了~就是全部都收了!不论好坏!
当然最显而易见的问题就是老爸的东西~你不见得全部都喜欢
一旦继承多了~就像政府举债一样~债留子孙!
後面的为了合乎所用~覆写再覆写~牵制再牵制
然後就天下大乱了...Q_Q
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.117.152.17
※ 编辑: andymai 来自: 122.117.152.17 (04/27 17:18)