程序是这样的: 
  import java.util.*; 
   public class test{ 
      public static void main(String args[]){ 
         Collection c =new ArrayList(); 
         c.add("hello"); 
         c.add(new Integer(100)); 
         System.out.println(c); 
      }  
  } 
打印结果:[hello,100] 
 
疑惑:1.Collection 只是个接口,怎么可以直接Collection c 啊 
      2.最后打印的时候 c是调用toString()方法,但是toString 方法并没有被重写啊,输出的结果怎么会是那样的呢? 
 
help,不胜感激。

解决方案 »

  1.   

    1、Java多态,Collection只是声明对象的类型,并没有直接 new Collection(); 只是把其子类声明为父类类型。2、ArrayList中已经重写了 toString(),你定义的是ArrayList子类,那么toString()就是调用ArrayList中的toString
      

  2.   

    可以用子类去定义父类,接口也算是父类啦,所以是完全可以的,而c使用Arraylist实例化的,所以调用的是ArrayList中的toString(),该方法应该是被重写过了
      

  3.   


    1.有点明白了。是说可以声明  interface类型的变量? 所以 才有Collection c..2.我查询了API,怎么没有看到 ArrayList类中有 toString()方法啊???
      

  4.   

    继承的toString()方法,你可以去ArrayList的父类中去找.
      

  5.   

    java.lang.Object 
      java.util.AbstractCollection<E> 
          java.util.AbstractList<E> 
              java.util.ArrayList<E>ArrayList的父类都是抽象类
      

  6.   

    java.lang.Object 就不是抽象类.
    再说是不是抽象类有什么关系?
      

  7.   

    其实,你看java的api文档里,有很多的方法的参数类型都是接口类型,实际上在调用的时候,传递的是实现了该接口的类的引用,这也是多态的一种体现:父类引用指向子类对象
      

  8.   

    恩,我想说的是
    ArrayList类中没有重写toString()方法,
    而ArrayList的父类除了java.lang.Object 都是抽象类,所以也没有重写toString()方法。这样的话,打印的结果怎么会是那样?java.lang.Object 
      java.util.AbstractCollection <E> 
          java.util.AbstractList <E> 
              java.util.ArrayList <E> 
      

  9.   

    Collection是接口,不能new,但程序new的是ArrayList,Collection指向了ArrayList对象,利用多态调用的是ArrayList的toString()方法
      

  10.   

    我记得不错的话AbstractList重写了toString方法。Java调用方法其实就是一个递归的过程,从子类一点点向父类找
      

  11.   

    Object是所有类的基类,ArrayList的toString()方法是继承自Object的
      

  12.   

    感谢各位了。
    刚刚想到了,抽象类里也可以有普通方法,然后去查了下ArrayList的父类。在AbstractCollection类中就重写了 toString()方法。非常感谢。
    小弟是乞丐,分数回报无能为力,所以只能心谢各位了。