2016-10-30 4 views
-3

기본 클래스와 하위 클래스 모두에서 equals 메서드를 재정의 한 예가 하나 있습니다.기본 클래스와 하위 클래스에서 equals를 재정의하는 방법

package com.test; 

public class Point2D { 

    private int x = 0; 
    private int y = 0; 

    public Point2D(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    @Override 
    public String toString() { 
     return (x + " " + y); 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (Point2D.class != o.getClass()) { 
      return false; 
     } 
     if ((o instanceof Point2D)) { 
      if ((((Point2D) o).x == this.x) && (((Point2D) o).y == this.y)) { 
       return true; 
      } 
     } 
     return false; 

    } 

    @Override 
    public int hashCode() { 
     return x + y; 
    } 

} 

class TestPoint2D { 

    public static void main(String args[]) { 
     Point2D d2 = new Point2D(2, 4); 
     Point2D d3 = new Point2D(2, 4); 
     Point3D d4 = new Point3D(2, 4, 5); 
     Point3D d5 = new Point3D(2, 4, 5); 
     System.out.println(d2.equals(d3)); 
     System.out.println(d3.equals(d5)); 
     System.out.println(d5.equals(d3)); 
     System.out.println(d4.equals(d5)); 
    } 

} 

class Point3D extends Point2D { 

    private int z = 0; 

    public Point3D(int x, int y, int z) { 

     super(x, y); 
     this.z = z; 
    } 

    @Override 
    public boolean equals(Object o) { 

     if ((o instanceof Point3D)) { 
      if ((((Point3D) o).z == this.z)) { 
       Point2D obj = (Point2D) o; 
       return super.equals(obj); 
      } 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return super.hashCode() + z; 
    } 

} 

내가 갖는 테스트하는 동안 출력 :

true 
false 
false 
false 

예상 출력은 다음과 같습니다

true 
false 
false 
true 

사람이 여기없는 걸 말해 주시겠습니까?

+0

디버거에서 코드를 단계별로 실행 했습니까? 당신이 여기에 게시하기 전에 그 일을해야한다는 것을 알아야합니다. –

답변

0

위에서 보았 듯이 코드는 두 개의 동일한 Point3D 개체 (하위 클래스 개체)가 같지 않음을 선언합니다 (여기에 d4d5). 나는이 때문에 Point2D.equals()이 if 문의 생각 :

if (Point2D.class != o.getClass()) { 
     return false; 
    } 

od5 자사의 getClass() 반환 Point3D.class, Point2D.class과 동일하지 않습니다 그래서. 리턴 된 결과는 Point3D.equals()에서 리턴되어 인쇄됩니다. 그 대신에 당신이 원하는 것 같아요

Jim Garrison은 물론 디버거를 사용하여 발견 할 수 있습니다.

+0

참. 나는 그 예기치 않은 결과를 얻는 이유를 안다. 그러나 나는 그것을 해결할 수 없었다. 당신의 도움을 주셔서 감사합니다. – Ravi

관련 문제