面向对象Java
我是一名学生,目前正在学习基本的面向对象java,我正在尝试创建一个OOP程序,它有3个类YouthGroup、Section和member。YouthGroup有3个部分,该程序的一个功能应该是,一个成员不能在同一部分中列出两次。现在我正在尝试创建此功能:面向对象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
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