方法比定义早调用

时间:2019-01-29 21:57:46

标签: 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 {

    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()获得之前执行。有什么解释吗?

控制台输出:

B
C
A: 

2 个答案:

答案 0 :(得分:3)

  

我不了解的是,当我运行程序时,family.getFamilyMembers();family.toString()之前执行。有什么解释吗?

toString()之前没有执行。它在System.out.println()之前执行,并显示toString()

结果

由于您在getFamilyMembers()内打印,并且getFamilyMembers在print语句之前被求值,因此您会看到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]

您可以return family.toString();

答案 1 :(得分:0)

我接受了@GBlodgett给我的答案:

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

输出:

A: BC