作者FatDevil (You Are The One!!)
站内java
标题Re: [问题] 不定长度引数的overloading问题
时间Mon Apr 7 22:19:09 2008
※ 引述《H45 (!H45)》之铭言:
: ※ 引述《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
恩 我不懂的是foo(String ... a) 本质应该是foo(String[] a)
在两个以上的String当引数的话,那没问题当然是呼叫foo(String ... a)
可是在只有一个String的引数的情形下呢?
他要怎麽去分辨要呼叫哪一个? 一个也是一个 多个也包含一个(看的懂吗XD)
因为overloading不就是用引数的差异来区分你呼叫的是哪一个method
这里就是我搞不清楚的地方@@
: 今天假设我们把 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.
恩 以上这个我就清楚了 感谢感谢~~
: 这篇含有反推和正推,也许会有些本末倒置
: 但是我认为我已经尽力地让事情的始末描述得够详细了....
谢谢H版友^^
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.175.118