作者H45 (!H45)
站内java
标题Re: [问题] 不定长度引数的overloading问题
时间Mon Apr 7 20:52:39 2008
※ 引述《FatDevil (You Are The One!!)》之铭言:
: import static java.lang.System.out;
: class Father{
: public void foo(String...a){
: out.println("Father.foo");
: }
: }
: class Son extends Father{
: public void foo(String a){
: out.println("Son.foo");
: }
: }
: public class app2{
: public static void main(String args[]){
: Father f = new Son();
: f.foo("test");
: }
: }
: 请教各位:
: 当我在一个引数的情形下怎麽知道他会去呼叫father 还是 son的foo()?
: 因为一但我把father class 的foo method改成public void foo(String a)
: 在多型下他会去呼叫son class 的foo() (overriding没错吧)
: 可是在foo(String...a)和foo(String a)
: 情形下怎麽知道他会去呼叫哪一个?
: 感谢``
此例 Father f = new Son();
f 的型别是 Father, 实体是 Son
所以能够看到的 f 成员都是 Father 型别所定义的
换言之 Son 型别里面新定义的成员都看不见
因此 f.foo("test") 只可能是 Father 的 foo(String ... a) 型态
然後因为 f 的实体是 Son, 而 Son 继承 Father
所以 f.foo("test") 实际上是呼叫 Son 的 foo(String ... a)
但是 Son 没有再定义 foo(String ... a)
这意味着 Son 的 foo(String ... a) 是继承自 Father 的 foo(String ... a)
也就是说 Son 的 foo(String ... a) 就是 Father 的 foo(String ... a)
如果需要一个名称来称呼这个现象的话,这叫作 overload
今天假设我们把 Father 的 foo(String ... a) 改成 foo(String a)
此时 f.foo("test") 就是去找 Father 有没有定义 foo(String a)
发现有定义之後,因为 f 的实体是 Son, 而 Son 继承 Father
所以 f.foo("test") 实际上是呼叫 Son 的 foo(String a)
而且 Son 有再定义 foo(String a)
因此最後 f.foo("test") 会呼叫 Son 所定义的那个 foo(String a)
如果需要一个名称来称呼这个现象的话,这叫作 override.
这篇含有反推和正推,也许会有些本末倒置
但是我认为我已经尽力地让事情的始末描述得够详细了....
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.117.172.148