2012-02-28 2 views

답변

2

정적 변수는 정의상 인스턴스 변수가 아니므로 동일한 클래스의 모든 인스턴스에서 항상 동일합니다.

0

모든 인스턴스 변수를 비교합니다.

정적 변수는 인스턴스 별이 아닌 클래스 별 변수이므로 동일하게 보장되므로 비교할 필요가 없습니다.

+0

어느 것이 좋습니다. – malhobayyeb

+0

인스턴스 변수 만. 'Die.sides'가 정적이라면'Die a.sides'를'Die b.sides' **와 비교하면 절대로 false가 될 수 없습니다. 통계는 값과 메모리 위치가 동일합니다. –

+0

왜 downvote? –

1

확실히 정적 인 것이 아닙니다.

모두과 비교하여 인스턴스 변수는 개체의 "ID"를 결정하는 요소에 따라 달라집니다. 이는 특정 애플리케이션의 맥락에서만 결정될 수 있습니다. 더 많은 정보가 필요합니다.

예를 들어 책을 나타내는 클래스가있는 경우 제목 (author)에 대한 메타 데이터 만 저장하려는 경우 두 책이 같은 책인지 여부를 확인하기 위해 ISBN 번호를 비교할 수 있습니다. 이러한 데이터베이스를 두 개 병합 한 경우 중복 레코드를 제거해야합니다.

그러나 실제 책의 라이브러리 카탈로그를 구현하는 경우 각 사본은 중요하고 다르기 때문에 ISBN 사본 번호를 비교할 수 있습니다. 두 라이브러리를 병합 한 경우 중복 사본을 감지 할 수 있습니다.

0

equals()를 사용하면 인스턴스 을 비교할 수 있습니다. 왜냐하면 그 인스턴스는 정적이기 때문에 둘 다 비교할 것이기 때문입니다.

0

Die 클래스의 모든 인스턴스에서 공유되므로 정적 데이터를 비교하는 것은 쓸모가 없습니다. 그러나 여러 필드를 직접 액세스하여 비교할 수 있습니다 (아래 예제 참조). Die 객체에 복잡한 입력란 (예 : Map, Set 등)이있는 경우 해당 객체에 대해 equals 메소드도 호출해야합니다 (다시, 아래 예 참조).

당신이 equals() 방법을 제공하려는 경우에는 Object 클래스 (equals (Object anOtherObject)에서 제공하는 하나보다는 과부하, 또는 적어도 당신은 또한 올바른 값을 반환하는지 확인 equals (Object anOtherObject)를 오버라이드 (override) 확인을 오버라이드 (override) 기본 구현은 동일한 인스턴스인지 여부 만 확인합니다. 그리고 당신의 방법으로 anOtherObjectDie의 인스턴스인지를 확인해야합니다. String name, int valueMap<Integer> complexField :

은 여기 Die 클래스는 3 개 필드가 있다고 가정 예입니다

public boolean equals (Object anOtherObject) { 
    if (anOtherObject == this) { 
     return true; 
    } 

    if (!anOtherObject instanceof Die) { 
     return false; 
    } 

    Die otherDie = (Die) anOtherObject; 

    if (this.value != otherDie.value || 
      !this.name.equals (otherDie.name) || 
      !this.complexField.equals (otherDie.complexField)) { 
     return false; 
    } 

    return true; 
} 

조쉬 블로흐의 "효과적인 자바는"제대로 equals을 구현하는 방법에 대한 매우 세부 정보 섹션이 있습니다. 당신은 확실히 그것을 읽어야합니다.

4

부울 등호 (aDie 다이)

잘못, 클래스는 equals(Object) 메소드를 호출하고 등호 (다이)를 무시합니다. 또한 (Object)와 동일한 필드를 사용하여 int hashCode() 메서드를 구현합니다. 그들은 모든이 다이에 대한 동일하기 때문에

@Override public boolean equals(Object aDie){ 
    if(aDie == null || aDie.getClass() != Die.class)return false; 
    if(aDie == this)return true; 
    Die other = (Die)aDie; 
    ... 
} 
@Override public int hashCode(){ 
    ... 
} 

당신은 정적 필드를 무시할 수 있습니다.

0

"static"키워드로 변수를 선언하면 그 변수를 "클래스 변수"라고합니다. 모든 인스턴스는 동일한 변수 사본을 공유합니다 (항상 같은 클래스의 모든 인스턴스에서 동일합니다). 클래스 변수는 인스턴스를 만들 필요없이 클래스에서 직접 액세스 할 수 있습니다.

관련 문제