overload和overridden

今天看的书是effective java,被其中的一个小问题困惑了好久,细细得读完几遍,终于明白是什么意思。测试代码如下

 1 package test.lan;
 2 
 3 import java.math.BigInteger;
 4 import java.util.ArrayList;
 5 import java.util.Collection;
 6 import java.util.HashMap;
 7 import java.util.HashSet;
 8 import java.util.List;
 9 import java.util.Set;
10 public class ff {
11     public static String classify(Set<?> s){
12         return "Set";
13     }
14     public static String classify(List<?> lst){
15         return "List";
16     }
17     public static String classify(Collection<?> c){
18         return "Unknown Collection";
19     }
20     public static void main(String[] args) {
21         Collection<?>[] collections = {
22                 new HashSet<String>(),
23                 new ArrayList<BigInteger>(),
24                 new HashMap<String,String>().values()
25         };
26         for (Collection<?> c:collections) {
27             System.out.println(classify(c));
28         }
29         System.out.println(classify(new HashSet<String>()));
30     }
31 }


  咋一看,我也以为我会输出三个不同的字符串,看了解释还是迷迷糊糊,不过最后还是被我搞清楚了原因。

  overload即重载,是静态多样性的体现,具体表现在方法被重载了,要调用哪个方法,在编译的时候就已经确定了(取决于句柄);而overridden是指动态重写(覆盖),要调用哪个方法,是在运行时确定的,选择的依据是被调用的方法所在对象的运行时类型,也就是句柄所指向的对象类型来确定的。

  因此,比较保守的做法是不重载相同参数个数的方法,而采用诸如不同的参数个数的方法,或者是静态工厂类。

posted on 2015-01-06 22:23  lan0906  阅读(396)  评论(0编辑  收藏  举报

导航