Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
面向对象Java_Java_Oop - Fatal编程技术网

面向对象Java

面向对象Java,java,oop,Java,Oop,我是一名学生,目前正在学习基本的面向对象java,我正在尝试创建一个OOP程序,它有3个类YouthGroup、Section和member。YouthGroup有3个部分,该程序的一个功能应该是,一个成员不能在同一部分中列出两次。现在我正在尝试创建此功能: public boolean setMembers(members members) { boolean crouded = true; for(int i = 0; i<this.getMembers().size

我是一名学生,目前正在学习基本的面向对象java,我正在尝试创建一个OOP程序,它有3个类YouthGroup、Section和member。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;
}
它将永远持续下去

这是成员类:

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;


}
公共类部分{
私人名单成员;
私有字符串部分名称;
私有整数maxNumber;
公共部分(列表成员、字符串部分名称、int maxNumber){
这个.成员=成员;
this.sectionName=sectionName;
this.maxNumber=maxNumber;
}
公共列表getMembers(){
返回成员;
}
公共布尔集合成员(成员){
boolean-cruded=true;
对于(int i=0;i您的
toString()
方法正在对自身进行递归调用

toString()
方法调用
getSection()
,该方法将返回一个
Section
对象,该对象将显式调用
toString()
。此
toString()
方法本身将获得一个
成员的
列表,它将调用
toString()
,但是,第二个
toString()
方法本身将回调
成员
toString()
方法,该方法将一次又一次地回调。我想,您看到问题了吧

这将导致
堆栈溢出错误
,因为它将无限深入调用堆栈

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中使用
+
操作符时会发生什么。当在
对象
之间使用
字符串
对象或您定义的任何
对象时,
+
操作符将显式地将其左侧和右侧参数转换为
字符串这在Java中是通过隐式调用
toString()
方法完成的,您已经覆盖了该方法,但如果您没有覆盖它,它仍然会存在(它位于
对象
超类中,因此所有Java对象都继承一些基本实现)

显示member类的toString方法。当出现错误时,请仔细注意堆栈跟踪;这一跟踪告诉您在何处查找问题的根源(member.java文件的第62行,位于其toString()方法中)。您可以自己解决这个问题,只需稍微关注一下。您还没有发布toString()方法,但我猜该成员的toString()调用了该节的toString(),该节调用了该成员的toString(),该节调用了该节的toString(),等等。这一点通过读取堆栈跟踪就很明显了。@Student,这似乎不太可能。请重新编译,再次运行代码,然后复制完整的堆栈跟踪(您上面发布的错误)添加到问题中。另外,请显示您的
toString()
部分
类中的
方法,如@JB Nizet所述。
成员
可以是
部分
的一部分,但
部分
不是成员的一部分。因此,您不应该在成员中有一个字段
部分
。此外,
equals
方法还应该明确地验证名称是否相同(或使用其他识别标记,如个人号码,可以使用重复的名称)。请使用清晰的名称,类名应为
CamelCase
以大写字母开头。
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;


}
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