import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 1.重载方法调用是在编译时决定的 * 2.重写的方法调用是在运行时决定的 */ public class Test2 { public void classify(Set<?> s) { System.out.println("set"); } public void classify(List<?> s) { System.out.println("list"); } public void classify(Collection<?> s) { System.out.println("unknown"); } public static void main(String[] args) { // 重载方法是在编译时决定的,所以编译时类型都是Collection,即调用的是第三个方法 Collection<?>[] c = { new HashMap<String, String>().values(), new ArrayList<String>(), new HashSet<String>() }; for (Collection<?> collection : c) { new Test2().classify(collection); } // 重写的方法调用是在运行时决定的,编译时都是Wine,但是在运行时 Wine[] wines = { new Wine(), new Sparkling(), new Champagne() }; for (Wine wine : wines) { wine.name(); } } } class Wine { void name() { System.out.println("wine"); } } class Sparkling extends Wine { void name() { System.out.println("Sparkling"); } } class Champagne extends Wine { void name() { System.out.println("Champagne"); } }
运行结果:
unknown
unknown
unknown
wine
Sparkling
Champagne
1.重载方法调用是在编译时决定的
2.重写的方法调用是在运行时决定的
解决上面重载和要预期的结果不同的问题:将重载的方法合并成为一个
public static void classify(Collection<?> s) { if(s instanceof Set<?>){ System.out.println("set"); }else if(s instanceof List<?>){ System.out.println("list"); }else{ System.out.println("unknown"); } }