今天看的书是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是指动态重写(覆盖),要调用哪个方法,是在运行时确定的,选择的依据是被调用的方法所在对象的运行时类型,也就是句柄所指向的对象类型来确定的。
因此,比较保守的做法是不重载相同参数个数的方法,而采用诸如不同的参数个数的方法,或者是静态工厂类。