繁体   English   中英

面向对象的Java

[英]object oriented Java

我是一名正在学习基本的面向对象Java的学生,我正在尝试创建一个包含3个YouthGroup,Section和Member的OOP程序,Youthgroup具有3个部分,该程序的功能应该是不能在同一列表中列出成员现在我要创建此函数两次:

public boolean setMembers(members members) {
    boolean crouded = true;

    for(int i = 0; i<this.getMembers().size();i++) {
        if(!this.members.contains(member)) {
            this.members.add(member);
        }
        else {
            System.out.println("Member already exists in this section");
            crouded = false;
        }
    }
    return crouded;
}

现在,在主要方法中,我正在执行以下操作:

public static void main(String[] args) {
    List<member> m = new ArrayList<>();
    Section s = new Section(m,"programming",3);
    member m1 = new member("tom",21,"male",s);
    member m2 = new member("kate",20,"Female",s);
    m.add(m1);
    m.add(m2);
    s.setMembers(m1);
    s.filterAge(21);
    System.out.println(s);
}

它给了我以下错误:

   Exception in thread "main" java.lang.StackOverflowError
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:648)
    at java.lang.StringBuilder.append(StringBuilder.java:208)
    at youthgroup.member.toString(member.java:62)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)

它会永远持续下去

这是成员类:

package youthgroup;

import java.util.Objects;

/**
 *
 * @author student
 */
public class member {
    private String name;
    private int age ; 
    private String gender;
    private Section section;

    public member(String name, int age, String gender, Section section) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.section = section;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Section getSection() {
        return section;
    }

    public void setSection(Section section) {
        this.section = section;
    }

    @Override
    public String toString() {
        String word = "Member name " +name;
        word+= "age : "+getAge();
        word+="Gender : "+ getGender();
        word+= " is in section : "+getSection();
        return word;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 67 * hash + this.age;
        hash = 67 * hash + Objects.hashCode(this.gender);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final member other = (member) obj;
        if (this.age != other.age) {
            return false;
        }
        if (!Objects.equals(this.gender, other.gender)) {
            return false;
        }
        return true;
    }





}

这是节类:

public class Section {
    private List<member>members;
    private String sectionName;
    private int maxNumber;

    public Section(List<member> members, String sectionName, int maxNumber) {
        this.members = members;
        this.sectionName = sectionName;
        this.maxNumber = maxNumber;
    }

    public List<member> getMembers() {
        return members;
    }

    public boolean setMembers(member member) {
        boolean crouded = true;

            for(int i = 0; i<this.getMembers().size();i++){
                if(!this.members.contains(member)){
                    this.members.add(member);
                }else{
                    System.out.println("Member already exists in this section");
                    crouded = false;
                }

            }



        return crouded;

    }

public String getSectionName() {
    return sectionName;
}

public void setSectionName(String sectionName) {
    this.sectionName = sectionName;
}

public int getMaxNumber() {
    return maxNumber;
}

public void setMaxNumber(int maxNumber) {
    this.maxNumber = maxNumber;
}

@Override
public String toString() {
    String word = " section name is : "+ getSectionName();
    word+=" Max number of members it can contain : "+ getMaxNumber();
    word+= " List of members :  "+getMembers();
    return word;
}

public boolean filterByAge(int a){
    boolean found = true;
    for(int i = 0; i<this.members.size(); i++){
        if(this.members.contains(a)){
            System.out.println("These members where found with this age  : "+ this.members.get(i).getName());
        }else{
            System.out.println("No member found !!!");
            found = false;
        }


    }

    return found;


}

非常感谢您的帮助,在此先感谢您。

您的toString()方法正在对其自身进行递归调用。

toString()方法调用getSection() ,该方法将返回一个Section对象,该对象将显式调用了toString() toString()本身将获取将在其上调用toString()member对象的List ,但是,第二个toString()方法本身将回调到member toString()方法,该方法将再次调用,然后再次。 我想您会看到问题。

这将导致StackOverflowError因为它将无限深地循环到调用堆栈中。

word+= " is in section : "+getSection();
//section is returned and called toString()
word+= " List of members :  "+getMembers();
//List of members are returned and called `toString()`, which will loop back to first line I've written

这里要了解的重要事情是在Java中使用+运算符时会发生什么。 当使用之间的Objects ,包括String对象或Objects定义时, +运营商将显式地转换其左,右手边参数Strings 在Java中完成此操作的方式是对已覆盖的toString()方法进行隐式调用,但是如果您未覆盖它,该方法仍将存在(它在Object超类中,因此所有Java对象都继承一些基本实现) )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM