作者forris (乔巴)
看板java
标题Re: [J2SE] 多型与转型
时间Sat Feb 16 21:57:28 2008
: 这是overridding(覆盖)的问题
: 子类别继承父类别的时候如果复写掉父亲的方法,
: 则由子类别产生的物件实体就只会具有子类别所时做的方法.
: (如果需要使用父类别的方法,只能在子类别内透过super关键字呼叫。)
: 如果你单纯记实体不实体的话,可能会翻船。
: 比方说下列的状况
: void foo(){
: Father father = ((Father) this);
: Son son = ((Son) this);
: System.out.println(father.greeting());
这一行会印出
class Son, 是因为 father 这个名称是在 Son 类别中,带有 Son 类别
的属性及方法,当呼叫 father.greeting() 时,就会先去找 Son 类别中有没有
greeting() 方法,若有,就执行之。
虽然 father 带有 Father 类别的属性及方法,但被 Son 类别给 override,
所以才会变成
class Son。
: System.out.println(son.greeting());
Son 类别中有 greeting() 方法,执行 son.greeting() 时,是
class Son。
: System.out.println(father.name);
会是
father, 因为是执行父类别的属性,
: System.out.println(son.name);
会是
son,执行子类别的属性
: }
: 请问後面两个name印出来的会是什麽? :)
: 这个就自己试试看吧
: 这跟method的差异是method是直接被覆盖,
: member的话,只是被子member给「遮掩」而已。
: (有点类似local variable跟member variable需要透过this区隔的差异)
: 所以当我在son内如果有需要取得father的greeting()的时候
: 要尽量透过super.greeting() 来处理,而避免透过转型。
: 同样的要存取父类别name也是透过super.name来处理
: System.out.println(super.name);
当子类别跟父类别均有同样的属性及方法时,
overriding 属性跟 overriding 方法结果会不一样?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.116.199.209
1F:推 TonyQ:你这样问我没办法回答你overriding只是一种描述,不会有结果 02/16 22:20
2F:→ TonyQ:你必须要有行为才会有结果,所以你应该缺了行为的描述。 02/16 22:21