把你的clone()代码改成这样试试:
<<
    public Object clone() throws CloneNotSupportedException {
        Object o = super.clone();
        ((Snake)o).next = (next==null?null:(Snake)next.clone());
        return o;
    }
>>

解决方案 »

  1.   

    xiaohaiz你好:
    这样可以,我那么写为什么不行,能解释一下吗?是基本概念搞错了吗?
    再问一个问题,vector 和arraylist的具体区别是什么?
      

  2.   

    vector里大多数方法都有synchronized关键字,所以线程安全,但是效率低。arraylist相反
      

  3.   

    TO myoopjava(海):
    呵呵,倒不是基本概念错误不错误的问题,而是编程的基本技能吧。
    首先,这么写就会导致编译不能通过:
    << o.next = (Snake)o.next.clone(); >>
    其次,即便修改正确了,这样写的语句也可能会导致NullPointerException异常的产生,因为你不能保证o.next一定不为null。
    这个clone实现本质上是一个递归的实现,所以修改成这样:
    <<  ((Snake)o).next = (next==null?null:(Snake)next.clone()); >>关于Vector和ArrayList,其本质可以说是一样的。都是List聚集的实现,而且都是采用的数组来表示存储,同样都是顺序存储的。区别主要在于:
    (1) Vector的方法是synchronized的,而ArrayList不是;
    (2) Vector是java 1.1的遗留产物,而ArrayList是JAVA2中Collections Framework中的一个实现,之所以保留Vector是为了保证向前的兼容性;
    所以说,在使用List实现的时候,请选择使用ArrayList而不是Vector。
    另外,如果希望ArrayList得到与Vector式的线程安全性,可以这样做:
    <<
    List list = Collections.synchronizedList(new ArrayList());
    >>
      

  4.   

    感觉你的问题在这里    o.next = (Snake)o.next.clone();1应该把当前的实例的next的clone赋给o的next所以应该把后面那个o去掉。2由于o是Object所以在用它的next前要造型成为Snake3同样,clone后的也要造型成为Snake才能赋给next4判断一下是否已经到了null避免java.lang.NullPointerException