Java中的每个类基本上都继承自Object,标准容器类自然也不例外。因此容器类都有toString()方法,并且重写了该方法,使得它生成的String结果能够表达容器本身,以及容器所包含的对象。例如ArrayList.toString(),它会遍历ArrayList中包含的所有对象,调用每个元素上的toString()方法:

public class Person {

    private int age;

    private String name;

    public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Person(int age, String name) {
super();
this.age = age;
this.name = name;
} @Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
} public static void main(String[] args) {
ArrayList<Person> persons = new ArrayList<>();
Person p1 = new Person(10, "张三");
Person p2 = new Person(12, "李四");
persons.add(p1);
persons.add(p2);
//(1)和(2)输出结果相同
System.out.println(persons);//(1)
System.out.println(persons.toString());//(2)
}
}

输出结果为:

[Person [age=10, name=张三], Person [age=12, name=李四]]
[Person [age=10, name=张三], Person [age=12, name=李四]]

如果你希望toString()方法打印出对象的内存地址,也许你会考虑使用this关键字:

public class Person {

    private int age;

    private String name;

    public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Person(int age, String name) {
super();
this.age = age;
this.name = name;
} @Override
public String toString() {
return "Person address:"+this;
} public static void main(String[] args) {
ArrayList<Person> persons = new ArrayList<>();
Person p1 = new Person(10, "张三");
Person p2 = new Person(12, "李四");
persons.add(p1);
persons.add(p2); System.out.println(persons);//(1)
System.out.println(persons.toString());//(2)
}
}

当你创建了Person对象,并将其打印出来的时候,你会得到一串非常长的异常。如果你将该Person对象存入一个ArrayList中,然后打印该ArrayList,你也会得到同样的异常。其实,当如下代码运行时:

"Person address:" + this

这里发生了自动类型转换,有Person类型转换成String类型。因为编译器看到一个String对象后面跟着一个"+",而再后面的对象不是String,于是编译器试着将this转换成一个String。它怎么转换呢?正是通过调用this上的toString()方法,于是就发生了递归调用

如果你真的想要打印出对象的内存地址,应该调用Object.toString()方法,这才是负责此任务的方法。所以,不能使用this,而是应该调用super.toString()方法。

即把上面的toString()方法改为:

@Override
public String toString() {
return "Person address:" + super.toString();
}

欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!

   ▼微信扫一扫下图↓↓↓二维码关注

 

Java字符串无意识的递归的更多相关文章

  1. 由Java中toString()方法引发的无意识的递归想到的

    先看一段很简单的java代码: toString()/** * @author jeffwong */ public class InfiniteRecursion { public String t ...

  2. Java中一种无意识的递归

    来自: Java编程思想P287 public class Main { /** * @param args */ @Override public String toString() { retur ...

  3. Java字符串排列算法

    Java字符串排列算法 题目:现有ABCDE 5个球 构成的排列组合 可重复抽取 最多取到16个 共有多少种组合方式? 比如:取1个球可以构成的组合有 A B C D E 共5种,取2个球可以构成的组 ...

  4. Java 与无符号那些事儿

    最近在使用 Java 作为 WebSocket 客户端连接 Node.js 的 WebSocket 服务器的时候,由于使用的客户端库比较老,所以遇到了字节符号的问题,上网查了一下,看到这篇文章写的很有 ...

  5. java 字符串笔记

    java字符串当中有三个关于字符串对象的类. String 首先谈论下他们各自的含义: 1.String含义为引用数据类型,是字符串常量.是不可变的对象,(显然线程安全)在每次对string类型进行改 ...

  6. Java字符串String

    Java字符串String 我们知道Java的字符窜是Immutable(不可变)的,一旦创建就不能更改其内容了:平常我们对字符串的操作是最多的,其实对字符串的操作,返回的字符串都是新建的字符串对象, ...

  7. Java字符串转16 进制工具类Hex.java

    Java字符串转16 进制工具类Hex.java 学习了:https://blog.csdn.net/jia635/article/details/56678086 package com.strin ...

  8. Java字符串String 集合的迭代器

    Java字符串String 我们知道Java的字符窜是Immutable(不可变)的,一旦创建就不能更改其内容了:平常我们对字符串的操作是最多的,其实对字符串的操作,返回的字符串都是新建的字符串对象, ...

  9. 面试官刁难:Java字符串可以引用传递吗?

    老读者都知道了,六年前,我从苏州回到洛阳,抱着一幅"海归"的心态,投了不少简历,也"约谈"了不少面试官,但仅有两三个令我感到满意.其中有一位叫老马,至今还活在我 ...

随机推荐

  1. 洛谷 [USACO05DEC] 布局 题解

    今天学了差分约束系统, 这是一道板子题. 核心:a[v]>a[u]+d 相当于从u到v连一条长度为d的有向边.由于要判断有环,所以要从0点先跑一遍spfa因为1点不一定能到所有的点. #incl ...

  2. POJ P2251 Dungeon Master 题解

    深搜,只不过是三维的. #include<iostream> #include<cstring> #include<cstdio> #include<algo ...

  3. circus 架构

    转自官方文档:https://circus.readthedocs.io/en/latest/design/architecture/ Overall architecture Circus is c ...

  4. C# await async Task

    //原文:https://www.cnblogs.com/yan7/p/8401681.html //原文:https://www.cnblogs.com/s5689412/p/10073507.ht ...

  5. Python json数据写入csv json excel文件

    一.写入 写入csv和json, 可以使用csv这个包写, 我这里没有使用, 并且把写csv和json的写到一起了 具体的代码就不解释了 def write_file(file_name, items ...

  6. 洛谷 题解 P2731 【骑马修栅栏 Riding the Fences】

    简单的开始 完美の开始 这里数组什么的用来干什么后面标注的清楚了 #include<iostream> #include<cstdio> #include<cmath&g ...

  7. Pandas的基本用法

    Pandas是使用python进行数据分析不可或缺的第三方库.我们已经知道,NumPy的ndarray数据结构能够很好地进行数组运算,但是当我们需要进行为数据添加标签,处理缺失值,对数据分组,创建透视 ...

  8. CH定理与线性递推

    才发觉自己数学差的要死,而且脑子有点浑浑噩噩的,学了一个晚上才学会 如果说的有什么不对的可以在下面嘲讽曲明 以下无特殊说明时,默认方阵定义在实数域上,用\(|A|\)表示\(A\)的行列式 特征值与特 ...

  9. 小技巧--解决eclipse导入的jar文件后,无法使用默认包中的方法问题

    问题:我已经导入了stdlib的jar文件,但是由于包是(default package)所以无法使用包中的方法 解决方法: 1.新建一个项目 2.新建一个文件夹 3.打开项目,新建一个包,然后导入j ...

  10. 基于Docker部署ETCD集群

    基于Docker部署ETCD集群 关于ETCD要不要使用TLS? 首先TLS的目的是为了鉴权为了防止别人任意的连接上你的etcd集群.其实意思就是说如果你要放到公网上的ETCD集群,并开放端口,我建议 ...