如何打印类的地址呢?可能会想到this
上代码
class Address{
String ss;
Address(String ss){
this.ss=ss;
}
@Override
public String toString() {
return "Address:"+this;
}
}
public class test {
public static void main(String args[]){
Address address=new Address("xixix");
System.out.println(address);
}
}
看上去,代码没有问题,可是运行会报错
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at com.example.eurekaclient.Address.toString(test.java:18)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.example.eurekaclient.Address.toString(test.java:18)
at java.lang.String.valueOf(String.java:2994)
。。。。。。。。。。。。。。省略
堆栈溢出,感觉很奇怪,但是仔细看一下代码的话,会发现,其实我们无意识的进行了递归,所以才造成了堆栈溢出
原因在于,我们打印this,其实就是调用this.toString() 然而我们打印this的语句本身就在this.toString()中,所以无限循化,
那么该怎么办呢
class Address{
String ss;
Address(String ss){
this.ss=ss;
}
@Override
public String toString() {
return "Address:"+super.toString();
}
}
public class test {
public static void main(String args[]){
Address address=new Address("xixix");
System.out.println(address);
}
}
把this改成super.toString()问题就解决了,因为父类也有toString方法,这样即可以得到我们想要的结果,又不会造成递归。
结果
Address:com.example.eurekaclient.Address@4b85612c
Process finished with exit code 0
参考资料:《java编程思想》