1

ClassAでは、次の 2 つのクラスがあるとします。ClassB

  • ClassA伸びObjectClassB伸びるClassA
  • ClassA引数コンストラクターがありません
  • ClassB整数変数 x と、x を初期化する整数引数を持つコンストラクターを持つ
  • ClassAequals継承していることをオーバーライドしませんObject
  • ClassB整数 x が両方のオブジェクトで同じ値を持つ場合、 のequals2 つのオブジェクトが等しいと見なされるようにオーバーライドします。ClassB

      //In Class B you have this method:
      public boolean equals (Object obj) {
          if (obj == null) {
              return false;
          }
          if (obj.getClass() != this.getClass()) {
              return false;
          }
          if (!super.equals(obj)) {
              return false;
          }
    
          B b = (B) obj;
    
          return this.x == b.x;
      }
    

主に、このコードを実行する場合

    B b1 = new B(1);
    B b2 = new B(1);
    System.out.println(b1.equals(b2));

「false」が出力されると思いますが、その理由を理解しようとしています。オーバーライドの概念を完全には理解していないかもしれませんが、xフィールドが同じであることを確認できるように、メソッドBをオーバーライドする必要があると考えました。Object.equals

私が見逃している「間違っている」と思われるものは何ですか?

4

2 に答える 2

6

を省略してください。

if (!super.equals(obj))
{
return false;
 }

これは、デフォルトの equals() メソッド (オブジェクト ID をチェックする) を使用するためです。

于 2013-07-21T18:37:43.370 に答える
2

コードが super.equals チェックを通過することは決してありません。これはObject.equals、2 つの異なるオブジェクトが常に等しいかどうかをテストする (オブジェクト参照を比較しているため) ためです。Object.equals参照を比較している場合、true を返すのは、参照をそれ自体と比較している場合のみです。

通常、equals をオーバーライドするのは、オブジェクトを値 (String や BigInteger など) で比較するためです。この場合、スーパー クラスの equals メソッド (参照で比較する) を参照する必要はありません。

于 2013-07-21T18:42:30.547 に答える