-1

在下面的代码中,为什么包含的两行会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]
4

1 回答 1

5

有两件事导致输出变化:

  • ToStringBuilder 避免在相等的实例上调用 toString() 以避免无限递归。
  • 你的 Person 和 Job 类继承了 HashMap 的 equals() 方法,导致new Person().equals(new Job()) == true

这意味着当您的示例中的 person 和 person.job 保持相等时,ToStringBuilder 不会调用 person.job.toString(),但是当地图内容发生变化时,会调用 person.job.toString()。

于 2018-02-26T04:19:32.673 回答