import java.util.*; 
public class CrashJava{
   public String toString(){
      return "CrashJava address:"+this+"\n";
   }
   public static void main(String args[]){
      Vector v=new Vector();
      for(int i=0;i<10;i++)
          v.addElement(new CrashJava());
      System.out.println(v);
   }
}java编程思想上说:"若只是简单的创建一个CrashJava对象,并将其打印出来,就会出现无穷无尽的一系列违例错误。然而,如果将CrashJava对象置入一个Vector,并像这里演示的那样打印Vector,就不会出现什么错误,此时java只是简单的崩溃"我的问题是:1)为什么简单的创建一个CrashJava对象,并将其打印出来,就会出现无穷无尽的一系列违例错误?CrashJava类里已经重写了toString方法啊。
2)为什么置入Vector后就不会了?

解决方案 »

  1.   

    public String toString(){
      return "CrashJava address:"+this+"\n";
      }
    等价于public String toString(){
      return "CrashJava address:"+this.toString()+"\n";
      }这是无限递归啊,最终肯定StackOverflow
      

  2.   

    楼主这样写,实际上是没有调用到toString()方法的,所以不会出错
      

  3.   

    public String toString(){
      return "CrashJava address:"+this+"\n";
      }同意3楼的说法,主要是这个this。
      

  4.   

    这种知识属于灰色地带,很少有人这么脑残改写toString()方法这样调用,知道这样用有问题就行了,没必要花太多时间,thinking in java的很大的问题就是让程序员不关注如何解决问题,而是费一些时间在语法细节上面,而像这种案例是现实当中根本极少出现的,意义不大
      

  5.   

    具体参看我的这篇帖子, http://topic.csdn.net/u/20110822/14/a373f224-270f-4056-b36f-ece87d8a680f.html?62082
    return "CrashJava address:"+this+"\n"; 还是会调用toString的!
      

  6.   

    为什么Sysmten.out.print(Obj)就是打印它的toString后面我也说到了,其实都调用了String.valueOf(Obj),这个里面的实现如果Obj不为null的话就调用toString