的StackOverflowError

Ass*_*saf 1 java stack-overflow

可能重复:
为什么我得到StackOverflowError

我使用两个课程:日期和考试.Date从三个整数设置Date对象:day,month,year; 考试从一个String courseName和一个Date对象设置Exam对象.

我正在尝试运行此代码:

    public Exam(String name, Date d)
    {
        courseName=name;
        examDate=new Date(d);
    }

    //**a method that checks if two dates are equal**
    public boolean equals (Date r)
    {
        return (examDate.equals(r));
    }

    public static void main(String[] args)
    {
        Date d=new Date(11,11,2011);
        String a=new String("OOP");
        Exam b=new Exam(a,d);
        Date c=new Date(11,11,2011);
        System.out.println(b.equals(c));
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试运行代码时,我在线程"main"中得到错误Exception java.lang.StackOverflowError

该错误表示问题出现在Date类的一行上,该行检查两个日期是否相等:

public boolean equals (Date d)
{
    return (this.equals(d));
}
Run Code Online (Sandbox Code Playgroud)

我会很感激知道为什么会这样.

Jam*_*mes 5

boolean equals(Date d) {
  this.equals(d); 
}
Run Code Online (Sandbox Code Playgroud)

无论这个类是什么,equals方法都是完全错误的 - 它只是调用自身,而后者又调用自身,然后调用自身,无限递归,直到得到StackOverflowError.

首先:覆盖等于的正确签名是:

boolean equals(Object obj)
Run Code Online (Sandbox Code Playgroud)

具有特定于类的覆盖仅仅是......奇怪的.看起来好像有人试图委托默认的equals()方法,但那不是那样做的.

如果这是一个自定义Date类,则equals应如下所示:

boolean equals(Object obj) {
  if (!obj instanceof Date) {
    return false;
  }
  Date other = (Date) obj;
  return this.field1.equals(date.field1) && this.field2.equals(date.field2)...... ;
}
Run Code Online (Sandbox Code Playgroud)

此外,在您实施equals()时,立即开始实施hashCode.它会让你感到悲伤.

当我覆盖equals()方法时,为什么要覆盖hashCode()?