1. ホーム
  2. java

equals メソッドに関連するJavaコード

2023-09-18 23:51:59

質問

試験のために練習しているのですが、わからない問題がありました。

次のコードについて、出力が何であるかを求めよ。

public class Test {

    private static int count = 0;

    public boolean equals(Test testje) {
        System.out.println("count = " + count);
        return false;
    }

    public static void main(String [] args) {
        Object t1 = new Test();
        Object t2 = new Test();
        Test t3 = new Test();
        Object o1 = new Object();

        ++count; t1.equals(t2);
        ++count; t1.equals(t3);
        ++count; t3.equals(o1);
        ++count; t3.equals(t3);
        ++count; t3.equals(t2);
    }
}

このコードの出力は count = 4 になりますが、なぜか理解できません。誰か助けてくれませんか?

どのように解決するには?

まず注意しなければならないのは public boolean equals(Test testje) はしません。 オーバーライド Object 's equals であるため、引数は Test ではなく Object というように、署名が一致しません。

そのため main メソッドは equals(Test testje) を一度だけ実行します。 t3.equals(t3); - を実行するときです。このときだけ、インスタンスの静的型と equals が実行され、引数の型が Test のクラスで実行されます。

t3.equals(t3); は、4番目の equals ステートメント (これは静的な count 変数が4つ増えた後に来る)ので、4が出力されます。

他のすべての equals ステートメントが実行されます。 Object 's equals であり、したがって何も表示されません。

より詳細な説明.

t1.equals() コール Object 's equals の型は静的(コンパイル時)なので、引数の型に関係なく t1Object であること、そして Test クラスはそのメソッドをオーバーライドしません。そのため Object クラスには equals メソッドに単一の Test という引数があるので equals(Test testje) がダイナミック(実行時タイプ)であろうと、 呼び出すことはできません。 t1 .

t3.equals() はどちらかを実行できます。 Object 's equals または Test のコンパイル時の型が等しいからです。 t3Test であること、そして Test クラスには2つの equals メソッド(1つは Object クラスで定義され、もうひとつは Test クラスで定義されたもの)。

選択されるメソッドは、引数のコンパイル時の型に依存します。 1. 引数が Object (のように t3.equals(o1); または t3.equals(t2); ), Object 's equals が呼び出され、何も表示されない。 2. 引数が Test のように t3.equals(t3); の両方のバージョンがあります。 equals はその引数にマッチしますが、 メソッドのオーバーロードの規則により、最も具体的な引数を持つメソッドである equals(Test testje) - が選ばれ count という変数が出力される。