需求:使用toString方法时将对象数组的地址打印出来
这个横简单代码如下
public class info{ public static void main(String[] args) { List<info> list = new ArrayList<>(); for(int i=0;i<5;i++) { list.add(new info()); } System.out.println(list); } }运行输出:
[test.info@52e922, test.info@25154f, test.info@10dea4e, test.info@647e05, test.info@1909752]
这就是我想要得到的效果。在打印输出时会调用info对象的toString方法继承自Object的toString
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
我们还知道一点
public class info{ public void getinfo() { System.out.println(this); } public static void main(String[] args) { new info().getinfo(); } }
运行输出
test.info@52e922
打印this会自动调用对象的toString方法。
根据以上我们可以自定义toStirng 使得toStirng输出自定义的信息
我们修改代码
public class info{ //重写方法 public String toString() { return "自定义信息"+this; } public void getinfo() { System.out.println(this); } public static void main(String[] args) { List<info> list = new ArrayList<>(); for(int i=0;i<5;i++) { list.add(new info()); } System.out.println(list); } }预期输出:
[自定义信息test.info@52e922, 自定义信息test.info@25154f, 自定义信息test.info@10dea4e, 自定义信息test.info@647e05, 自定义信息test.info@1909752]
实际输出: 造成了递归调用这时因为用this在拼接字符串时调用了当前对象的toString方法
Exception in thread "main" java.lang.StackOverflowError at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449) at java.lang.StringBuilder.append(StringBuilder.java:136) at java.lang.StringBuilder.<init>(StringBuilder.java:113) at test.info.toString(info.java:36)
而我们实际想调用的是Object的toString
知道了这个原因再次修改代码
public class info{ //将this去掉 public String toString() { return "自定义信息"+super.toString(); } public void getinfo() { System.out.println(this); } public static void main(String[] args) { List<info> list = new ArrayList<>(); for(int i=0;i<5;i++) { list.add(new info()); } System.out.println(list); } }
运行结果符合预期
[自定义信息test.info@52e922, 自定义信息test.info@25154f, 自定义信息test.info@10dea4e, 自定义信息test.info@647e05, 自定义信息test.info@1909752]