2017-04-21 1 views
-2

저는 equals 메서드를 이해하려고합니다. 난 그냥 동작 만보고 사용자 정의 클래스에서이 메소드를 오버라이드 인해 무한 loop.I에 메모리 오류 벗어나 려 알고 오버라이드 (override)하는 계약 방법 1) 재귀 2) 대칭 3) 트랜 4) 일관된 동일 당신은 재귀 적 equals 방법을 요구하고있다OutOfMemoryError는 equals 메서드 구현으로 인해 무한 루프로 인해 발생합니다.

public class Reflexivity 
{ 
    public static void main(String[] args) { 
    Reflexivity reflexivity = new Reflexivity(); 
    Reflexivity reflexivity1 = new Reflexivity(); 
    System.out.println(reflexivity.equals(reflexivity1)); 
    } 
@Override 
public boolean equals(Object obj) { 
    if (obj == this) { 
      return true; 
     } 
    if (!(obj instanceof Reflexivity)) { 
      return false; 
     } 
    // TODO Auto-generated method stub 
    return this.equals(obj); 
} 
} 
+2

당신의'this.equals (obj)'가 무한 루프를 일으키고 있습니다. – Oswald

+4

그냥'OutOfMemoryError'가 아니라'StackOverflowError'를 얻어야한다는 것을 지적하고 싶습니다. 객체가 생성 된 경우에만 OOME을 얻습니다. 'equals' 메쏘드로 아무 것도 생성되지 않습니다. –

답변

0

5)에 null 참조의 경우, false를 반환해야합니다. 종료 조건이 없으면 무한 루프가 발생합니다.

첫 번째 및 두 번째 if 문은 false을 반환하기 때문에 결과적으로 무한 루프가 될 때마다 자체적으로 호출됩니다.

1

구현이 잘못되었습니다.

두 개의 다른 Reflexivity 개체가있는 경우 equals을 계속 호출해야합니다 (또는 메모리가 부족한 경우). 두 개체가 같거나하지 않으면 어떤 점에서

당신은 실제로

+0

... 그가 상태가없는 '반사성'을 정의했다면, 단지 두 개의 (정상적인) 구현은 "모두 동등하다"와 "모든 별개의 인스턴스는 동일하지 않다"라는 것이다. –

+0

@StephenC 여기에 표시되지 않은 상태가 있다고 가정합니다. 그렇지 않다면 당신의 권리. – John3136

0

성명은 this.equals(obj) 또 다시 equals()를 호출의 infinit의 recursiv 루프가 발생합니다 ... 결정하는 몇 가지 코드를 작성해야합니다. 귀하의 학급이 어떤 주를 보유하지 않기 때문에, Object.equals()의 행동은 정확히 당신이 필요로하는 것입니다. 따라서 equals()을 전혀 무시하지 마십시오.

관련 문제