Javaにおけるメソッド隠蔽とは?JavaDocの説明でもわかりにくい
2023-11-15 09:16:39
疑問点
ジャバドック は言う。
の場合、呼び出される隠しメソッドのバージョンはスーパークラスのものであり、呼び出されるオーバーライドされたメソッドのバージョンはサブクラスのものである。
は私にはピンと来ません。この意味を示す明確な例があれば、非常にありがたいです。
どのように解決するのですか?
public class Animal {
public static void foo() {
System.out.println("Animal");
}
}
public class Cat extends Animal {
public static void foo() { // hides Animal.foo()
System.out.println("Cat");
}
}
ここで
Cat.foo()
を隠すと言われています。
Animal.foo()
. 静的メソッドはポリモーフィックではないので、隠蔽はオーバーライドのようにはいきません。そのため、以下のようなことが起こります。
Animal.foo(); // prints Animal
Cat.foo(); // prints Cat
Animal a = new Animal();
Animal b = new Cat();
Cat c = new Cat();
Animal d = null;
a.foo(); // should not be done. Prints Animal because the declared type of a is Animal
b.foo(); // should not be done. Prints Animal because the declared type of b is Animal
c.foo(); // should not be done. Prints Cat because the declared type of c is Cat
d.foo(); // should not be done. Prints Animal because the declared type of d is Animal
クラスではなくインスタンスに対して静的メソッドを呼び出すことは、非常に悪い習慣であり、決して行ってはいけません。
これをインスタンスメソッドと比較すると、インスタンスメソッドはポリモーフィックであり、したがってオーバーライドされます。呼び出されるメソッドは、オブジェクトの具体的な、実行時の型に依存します。
public class Animal {
public void foo() {
System.out.println("Animal");
}
}
public class Cat extends Animal {
public void foo() { // overrides Animal.foo()
System.out.println("Cat");
}
}
すると、以下のようになります。
Animal a = new Animal();
Animal b = new Cat();
Cat c = new Cat();
Animal d = null;
a.foo(); // prints Animal
b.foo(); // prints Cat
c.foo(); // prints Cat
d.foo(): // throws NullPointerException
関連
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Javaで数値を小数点以下n桁に丸める方法
-
[解決済み】「インターフェースに合わせたプログラム」とはどういう意味ですか?
-
[解決済み】インターフェイスのメソッド実装は@Overrideすべきなのか?
最新
-
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 の違いについて理解を深める。
-
型に解決できない エラー解決
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
java send https request prompt java.security.cert.について。
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
Zipファイルの圧縮・解凍にantを使用する
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
[解決済み] 静的クラスとシングルトンパターンの違い?