在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()方法吗?
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()方法吗?
return "InfiniteRecursion address:" + this + "\n";
}
等价于
public String toString(){
return "InfiniteRecursion address:" + toString() + "\n";
}
会导致栈溢出
我问的正是这个问题:toString()结果为什么能用super.toString()来代替?使用this时语法上没有问题,但super时却必须写明是super.toString()为什么?字符串运算时,不是都会强制调用对象的toString()方法吗?
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()代替吗?这又如何解释,如何处理?