有这么一个类:public class Interface { public static void print( Collection c) 

    System.out.println("This is a Collection."); 
} public  static void print( ArrayList a) 

    System.out.println("This is a ArrayList"); 
} public static void  main( String []args) 

    Collection a = new ArrayList(); 
    print( a ); 

}可以看到:
类中有2个重载函数print(),在main()方法中调用的时候,如果 
Collection a = new ArrayList(); 
print( a ); 
调用的是: 
public static void print( Collection c) 

System.out.println("This is a Collection."); 

而如果: 
ArrayList a = new ArrayList(); 
print( a ); 
调用的将是: 
public  static void print( ArrayList a) 

System.out.println("This is a ArrayList"); 

高人能告诉我原因啊(实质一点的原因)? 

解决方案 »

  1.   

    我想,动态绑定时,jvm 可能会先具体类,然后再向上传递的查找吧,似乎有点印象,但不记得哪里看到过,你看看 thinking java ,里面可能有
      

  2.   

    今天学到了个, Interface 原来可以做为类名存在啊
      

  3.   

    开始没认真看,我还以为接口里面写实体方法.你实例话的对象一个是Collection 一个是ArrayList 一个是接口,一个是具体的类具体什么原因还真没想过,帮你顶
      

  4.   

    谢谢大家了,觉得 ZangXT 说的有道理啊:
    重载是静态绑定的,根据声明类型来确定。 
    多态才是根据运行时类型来确定。 
      

  5.   

    是最特殊匹配,ArrayList 明显比 Collection 更特殊,更接近于参数类型如果出现2个都一样的特殊,则会编译错误。
      

  6.   

    java谜题上的一个好玩的例子public class Main{
        public static void test(double[] array){
            System.out.println("double array");
        }
        public static void test(Object obj){
            System.out.println("Object obj");
        }
        public static void main(String[] args) {
            test(null);
        }
    }
      

  7.   


    interface才是关键字,Interface 不是,HOHO
      

  8.   

     Collection a 
     声明的时候 a 是Collection
      

  9.   

    a是Collection的一个引用,是ArrayList的一个实例.