Bri*_*ack -1 java tostring apache-commons apache-commons-lang apache-commons-lang3
在下面的代码中,为什么包含的两行会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]
两件事有助于输出变化:
new Person().equals(new Job()) == true这意味着虽然您示例中的 person 和 person.job 保持彼此相等,但 ToStringBuilder 不会调用 person.job.toString(),但是当地图内容更改时,将调用 person.job.toString()。
| 归档时间: | 
 | 
| 查看次数: | 315 次 | 
| 最近记录: |