1

スーパークラスのプライベートインスタンス変数にアクセスする方法を理解するのに問題があります。名前と品種が同じであるかどうかを比較するDogクラスのequalsメソッドを作成していますが、nameはPet内のプライベートインスタンス変数です(Dogが継承します)。

これが私のコードです:

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;
        }
    }
}

私のメインクラスでは:

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

何らかの理由で、Petクラスのequalメソッドを使用し続けます。

ありがとう

4

2 に答える 2

2

@Pshemoは、問題の直接の原因を特定しました。署名が一致しないため、Pet.equals(Object)は上書きされません。`Dog.equals(String)そして、あなたのd1.equals(d2)呼び出しは、最も厳密に一致するメソッドシグネチャにバインドされています。これは、Pet仮パラメータではなく仮パラメータを持つものObjectです。

Dog.equals(String)しかし、それを修正すると、メソッドに別の問題が発生します。

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

Pet.equalsの署名を修正すると、Dog.equals...と。が再帰的に呼び出されますStackOverflowError。(Dog.equalsはDog.equalsを呼び出し、Dog.equalsを呼び出します...)。基本的にq.equalsは、現在実行中の方法と同じです。型キャストは何もしていません...

これに変更します:

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

このsuper方法で使用されるキーワードは、オーバーライドされたバージョンのequalsメソッドを呼び出します。


スーパークラスのプライベートインスタンス変数にアクセスする方法を理解するのに問題があります。

これは、問題の原因とは別の問題です。しかし、答えは、子クラスのメソッドが親クラスの変数にアクセスできるようにするprivate場合は、親クラスにgetterメソッドやsetterメソッドを追加するか、変数のアクセスを(通常)protected

于 2012-12-15T01:10:18.927 に答える
1

注意深く見ると、Dogクラスには2つのequalsメソッドがあります。

  • equals(Pet other)スーパークラスを形成する
  • equals(Object obj)犬のクラスから。

d1.equals(d2)d1とd2がDogインスタンスである場所を使用しているため、Javaは、同等性equals(Pet other)のみをチェックするスーパークラスのメソッドを使用します。name

于 2012-12-15T01:13:21.257 に答える