java为什么ToStringBuilder工作不一致?
在下面的代码中,为什么包含System.out.println(person);
的两行产生不同的输出?第二行间接调用方法Job.toString
,生成字符串"Manager"
,但第一行神秘地没有生成Job@28f67ac7
。在我看来,介于person.put("a", "b");
之间的这条线不应该有任何区别
代码:
import java.util.*;
import org.apache.commons.lang3.builder.*;
class Job extends HashMap<String, String> {
@Override public String toString() {
return "Manager";
}
}
class Person extends HashMap<String, String> {
Job job;
Person() {
this.job = new Job();
}
@Override public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person);
person.put("a", "b");
System.out.println(person);
}
}
控制台:
Person@2b80d80f[job=Job@28f67ac7,threshold=0,loadFactor=0.75]
Person@2b80d80f[job=Manager,threshold=12,loadFactor=0.75]
# 1 楼答案
有两件事导致了产出的变化:
new Person().equals(new Job()) == true
这意味着当一个人和另一个人。在你们的例子中,工作是平等的,ToStringBuilder不会给这个人打电话。工作toString(),但当地图内容更改时,person。工作将调用toString()