在java编程思想中提到,为了避免无意识的递归,输出对象内存地址时,使用super.toString(),而不是this,看代码如下:public class InfiniteRecursion{public String toString(){
return " InfiniteRecursion address: " + this + "\n";//这会导致递归调用,应该将this改为super.toString()
}public static viod mian(String[] args){
List<InfiniteRecursion> v = new ArrayList<InfiniteRecursion>();
for(int i=0;i<10;i++)
v.add(new InfiniteRecursion());
System.out.println(v);
}}我的疑问有两点:
1、super.toString方法和this.toString()方法得到的值是等价的吗?为什么?
2、使用this时语法上没有问题,但super时却必须写明是super.toString()为什么?字符串运算时,不是都会强制调用对象的toString()方法吗?

解决方案 »

  1.   

    public String toString(){
        return "InfiniteRecursion address:" + this + "\n";
    }
    等价于
    public String toString(){
        return "InfiniteRecursion address:" + toString() + "\n";
    }
    会导致栈溢出
      

  2.   


    我问的正是这个问题:toString()结果为什么能用super.toString()来代替?使用this时语法上没有问题,但super时却必须写明是super.toString()为什么?字符串运算时,不是都会强制调用对象的toString()方法吗?
      

  3.   

    class Test{
    public String toString(){return "address: Test\n";}
    }public class Hello extends Test { public String toString(){return "address: "+super.toString()+"\n";} public static void main(String[] args) {
    Hello h=new Hello();
    System.out.println(h);
    }}假设有这样的代码,你希望用super.toString()得到Hello的内存地址,结果肯定不是了。所以toString()能用super.toString()代替吗?这又如何解释,如何处理?
      

  4.   

    super是类,而不是对象。这样看就都解了。