equals メソッドに関連するJavaコード
質問
試験のために練習しているのですが、わからない問題がありました。
次のコードについて、出力が何であるかを求めよ。
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
の型は静的(コンパイル時)なので、引数の型に関係なく
t1
は
Object
であること、そして
Test
クラスはそのメソッドをオーバーライドしません。そのため
Object
クラスには
equals
メソッドに単一の
Test
という引数があるので
equals(Test testje)
がダイナミック(実行時タイプ)であろうと、 呼び出すことはできません。
t1
.
t3.equals()
はどちらかを実行できます。
Object
's
equals
または
Test
のコンパイル時の型が等しいからです。
t3
は
Test
であること、そして
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
という変数が出力される。
関連
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
プロジェクトの依存関係を解決できない。
-
ApiModel と @ApiModelProperty の使用法
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
強制型変換について
-
シェルコマンドやスクリプトのJavaコール
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
FindBugの使用概要
-
eclipse にリソースリーク:'in' が閉じない
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
アクセス制限の解決方法: ---- in Java
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.