2012-12-15 4 views
1

수퍼 클래스의 개인 인스턴스 변수에 액세스하는 방법을 알아 내는데 어려움이 있습니다. 이름과 유형이 같은지 비교하는 equals 메소드를 Dog 클래스에 작성하고 있지만 이름은 Pet 내부의 개인 인스턴스 변수 (Dog가 상속 함)입니다. 내 애완 동물 클래스의 동일한 방법을 사용하여 유지 어떤 이유로상속 및 개인 인스턴스 변수

Dog d1 = new Dog("Harry", "Puggle"); 
Dog d2 = new Dog("Harry", "Pug"); 
System.out.println(d1.equals(d2)); 

:

public class Pet { 

    private String name; 

    public Pet(){ 
     name = ""; 
    } 
    public Pet(String name){ 
     this.name = name; 
    } 

    public boolean equals(Pet other){ 
     return this.name.equals(other.name); 
    } 
} 

내 개 클래스 : 내 메인 클래스에서

public class Dog extends Pet { 
    private String breed; 
    public Dog(String name, String breed) { 
     super(name); 
     this.breed = breed; 
    } 

    public Dog(){ 
     breed = ""; 
    } 

    @Override 
    public boolean equals(Object obj){ 

     if(obj == null){ 
      return false; 
     } 

     if(obj.getClass() != this.getClass()){ 
      return false; 
     }else{ 
      Pet p = (Pet)obj; 
      Pet q = (Pet)this; 
      Dog temp = (Dog)obj; 
      boolean name = q.equals(p); 
      boolean bred = breed.equals(temp.breed); 
      return name && bred; 
     } 
    } 
} 

여기

내 코드입니다 .

감사합니다.

+0

'Dog' 클래스의'equals'을 전혀 사용하지 않는다는 것을 의미합니까? 그렇지 않다면 코드에서 분명합니다. – nawfal

답변

2

@Pshemo는 문제의 직접적인 원인을 확인했습니다. Pet.equals(Object)`Dog.equals(String)을 덮어 쓰지 않습니다. 서명이 일치하지 않기 때문입니다. 그리고 d1.equals(d2) 호출은 Object 형식 매개 변수가 아닌 Pet 형식 매개 변수가있는 가장 밀접하게 일치하는 메서드 서명에 바인딩됩니다.

하지만 당신은 Dog.equals(String) 방법의 또 다른 문제가있는 것을 해결 한 후에 : 당신이 Pet.equals의 서명을 수정하는 경우, 즉 Dog.equals에 재귀 호출이 발생할 것입니다

 Pet p = (Pet)obj; 
     Pet q = (Pet)this; 
     boolean name = q.equals(p); 

가 ... 그리고 a StackOverflowError. Dog.equals는 Dog.equals를 호출합니다. Dog.equals는 ...을 호출합니다. 기본적으로 q.equals은 현재 실행중인 것과 같은 방법입니다. 타입 캐스트

변경을이에 ... 아무것도되지 않습니다

 Pet p = (Pet)obj; 
     boolean name = super.equals(p); 

이 방법을 사용 super 키워드는 equals 메소드의 오버라이드 (override) 버전을 호출합니다.


나는 문제가 수퍼 클래스의 전용 인스턴스 변수에 액세스하는 방법을 알아내는 데 문제.

이는 문제의 원인과 다른 문제입니다. 그러나 대답은 자식 클래스 메서드가 부모 클래스의 private 변수에 액세스 할 수있게하려는 경우 getter 및/또는 setter 메서드를 부모 클래스에 추가하거나 변수 액세스를 다음과 같이 변경해야한다는 것입니다. (일반적으로) protected.

+0

// Dog.equals (String)에 또 다른 문제가 있습니다 // OP의 q에서 이러한 메소드가 어디에 있습니까? 또한 그의 질문에 stackoverflow가 발생할 수 있습니까? – nawfal

+0

애완 동물 내부에서 equals 메서드를 호출하기 때문에 q.equals (p)가 예외를 throw하는 이유를 알아 내는데 어려움이 있습니까? – vtshadow

+0

@vtshadow - 시도해보고 내가 옳은지 확인하십시오 ... –

1

주의 깊게 보면 당신의 개 클래스는 두 equals 방법이 있습니다

  • equals(Pet other) 형태의 슈퍼 클래스
  • equals(Object obj) 개 클래스를.

당신은 자바 만 name 평등을 확인하는 슈퍼 클래스의 equals(Pet other) 방법을 사용합니다 D1과 D2는 Dog 인스턴스 d1.equals(d2)을 사용하고 있기 때문에.