Java 方法的调用时间早于定义的时间

Java 方法的调用时间早于定义的时间,java,oop,Java,Oop,我有以下几行代码: Family family = new Family("A"); Man man = new Man("B"); Woman woman = new Woman("C"); family.addPerson(man); family.addPerson(woman) System.out.println(family.toString() + ": " + family.getFamilyMembers()); 这是家庭课: public class Family {

我有以下几行代码:

Family family = new Family("A");
Man man = new Man("B");
Woman woman = new Woman("C");
family.addPerson(man);
family.addPerson(woman) 
System.out.println(family.toString() + ": " + family.getFamilyMembers());
这是家庭课:

public class Family {

    private String name;
    private ArrayList<Person> family = new ArrayList<>();

    public Family(String name) {
        this.name = name;
    }

    public void addPerson(Person person) {
        this.family.add(person);
    }

    public String getFamilyMembers() {
        for (Person person : this.family) {
            System.out.println(person.toString());
        }
        return "";
    }

    @Override
    public String toString() {
        return this.name;
    }

}
我不明白的是,当我运行程序时,
family.getFamilyMembers()family.toString()
get之前执行code>get。有什么解释吗

toString()
之前不会执行它。它在打印
toString()结果的
System.out.println()之前执行


由于您在
getFamilyMembers()
内部打印,并且在print语句之前对
getFamilyMembers
进行了计算,因此您可以看到
getFamilyMembers()
toString
之前的结果

如果将
getFamilyMembers()
方法更改为返回
Person
对象的名称而不是打印它们,那么您将看到预期的结果:

public String getFamilyMembers() {
    StringBuilder sb = new StringBuilder();
    for (Person person : this.family) {
        sb.append(person.toString();
    }
    return sb.toString();
}
或者如果您对

[A, B, C]

您可以
返回family.toString()

我同意@GBlodgett给我的答案:

    public String getFamilyMembers() {
    String a = "";
    for (Person person : this.family) {
        a = a.concat(person.toString());
    }
    return a;
}
产出:

A: BC

你甚至从未将
男人
女人
添加到
家庭
。请确保问题对我们来说是可复制的。很抱歉,我忘记在我的问题中包括family.addPerson(男子)和family.addPerson(女子)
getFamilyMembers()
将在
sout
方法之前运行,以评估它应该打印什么。换句话说,首先执行
toString()
,然后执行
getFamilyMembers()
,它有自己的打印语句,最后执行
System.out.println()
在main方法中。但是返回将导致循环stop@Ezrab_否,将
字符串连接到循环内,然后在循环后返回
A: BC