- import java.util.*;
- class OverrideTest
- public static void f(Collection c){
- System.out.println("Collection");
- public static void f(List m){
- System.out.println("List");
- public static void f(Set m){
- System.out.println("Set");
- public static void main(String[] s){
- Collection[] c={new ArrayList(),new HashSet()};
- for(int i=0;i<c.length;i++)
- f(c);
面试时,想了一下,直接说
很悲剧的错了,面试官细致的讲解了一下,然后豁然开朗。
解答(不要紧着看答案)
这里,主要考察的是重载机制:方法的重载是在编译时绑定。其中重载的方法f,形参Collection包含List,Set。在main方法中,c是Collection类型的数组,分别存放ArrayList和HashSet实例。而f(c)因为不像重写一样是动态绑定的,不会出现,当c是ArrayList实例时,f调用的是f(List)方法;当c是HashSet实例时,调用f(Set)方法。因为c是Collection类型数组,直接在编译时确定f应该指向f(Collection)方法,
所以运行结果是: