作者Shrugg (泪眼问花花不语)
看板java
标题[问题] 父变数指到子物件的继承问题
时间Sat Apr 27 14:31:14 2013
对不起,又碰到观念性问题想不通了,所以藉休息思考时间又来这边寻找温情.嘻
请问当程式跑到 Father f = new Son()後,从记忆体来看
不是就一个Stack区的变数f指向Heap区的一个Son物件吗?
如果这时候执行f.show() 为什麽IntelliSense只能选择父类别里的show()?
但是如果父类跟子类同时有定义show(),即使选用的是父类的show()
却是显示子类show()的内容呢?
从物件来看,父类跟子类会有不同的方法跟成员变数,可以理解是不同的东西
但是变数的目的不是存值就是存参照,变数为什麽会有父跟子的区分呢?
谢谢.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 137.132.239.190
1F:推 coolcomm:把编译时期和执行时期做的事搞清楚 04/27 14:54
2F:→ coolcomm:`f` 不一定要指向一个 `Son` 类别的物件 04/27 14:57
请问您的意思是,编译器是根据宣告来设定IntelliSense的? 虽然这边参照到子类
但是赋值是执行时期的问题? 所以要正常编译成功,编译时期只能选用父类有的方法
执行时期因为真正参照到的物件是子类,所以我们其实是拿编译时期的父类方法来执行
执行时期的子类参照? 也就是要执行时期让父类变数可以执行子类方法,必须要在
父类中定义想要执行的子类方法,这样才能骗过编译器而让子类方法留下来?
※ 编辑: Shrugg 来自: 137.132.239.190 (04/27 15:36)
3F:→ cha122977:override? 04/27 15:33
※ 编辑: Shrugg 来自: 137.132.239.190 (04/27 15:47)
4F:→ andymai:都已经明确写在程式了~还有分执行和编译时期? 04/27 16:38
5F:→ coolcomm:我指的就是原po修文里的意思 思考方式不同而已 04/27 18:37
6F:→ Shrugg:我还是不了解您第二句的意思,为什麽f不一定指向Son物件? 04/27 20:12
7F:→ Shrugg:已经是Father f = new Son();为什麽还说不一定指向Son物件 04/27 20:15
8F:→ Shrugg:还是说您用词太过精简了,您的意思是编译时期编译器不知道f 04/27 20:20
9F:→ Shrugg:还不知道指向何处,所以是不一定? 直到Runtime才确定? 04/27 20:23
10F:→ andymai:编译时期知道~但写的时候可能不知道!弹性的程式就是这样! 04/27 21:55
11F:→ andymai:直接指定当然知道~但是有时候可能不知道~你也不需要知道! 04/27 21:59
12F:→ andymai:就像新训班长一开始需要知道入伍生叫啥吗?不需要!反正叫你 04/27 22:00
13F:→ andymai:动起来~就是给我动起来~管你从哪里来~妈妈嫁给谁... 04/27 22:07
14F:→ andymai:还是很难体会的话~就试着写程式~用一种定义控制不同的物件 04/27 22:10
15F:推 KanoLoa:现在单纯的多型都要讲得这麽深澳吗... 04/29 02:31
16F:推 coolcomm:结果原po发现每个人都给他一个不同的解释(逃 04/29 20:04
17F:→ andymai:不同?会吗?不过这种东西没实际写过~还蛮难去体会的... 04/29 21:11