作者coolcomm (coolcomm)
看板java
标题Re: [问题] 父变数指到子物件的继承问题
时间Sat Apr 27 20:48:48 2013
※ 引述《andymai (人生只有一次)》之铭言:
: 标题: 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 怎麽会知道它是鸭子还是鸟~或是别的动物?
: 所以当然只能选择父类别(动物)里的 走()
Java 是严格的静态语言,
但 Java 的静态型别却只存在於编译时期,换句话说,只是编译时期检查而已。
* * *
宣告一个静态型别为`动物`的变数 `f` ,参考至`鸭子`型态的新物件
而在编译时期,光看 `f` 怎麽会知道它的动态型别会是`鸭子`还是`鸟`~或是其他`动物`
的子类别?
所以当然只能选择静态型别(`动物`)里的 `走()`
底下是一个范例
class 动物 {}
class 鸭子 extends 动物 {
@Override
public String toString() {
return "呱呱";
}
}
class 鸟 extends 动物 {
@Override
public String toString() {
return "啾啾";
}
}
public class Main {
public static void main(String args[]) {
动物 f;
if(args[0].equals("鸭子")) f = new 鸭子();
else if(args[0].equals("鸟")) f = new 鸟();
else f = new 动物();
System.out.println(f);
}
}
(......以下恕删)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.110.151.94
1F:推 PsMonkey:建议不要用单纯两个减号作分隔线,不然别人回文会很麻烦 04/27 20:53
已修改。
※ 编辑: coolcomm 来自: 101.15.200.10 (04/29 20:06)