1. ホーム
  2. java

[解決済み] 最終静的手法の挙動

2022-06-02 07:18:13

質問

静的メソッドで修飾子を使って遊んでいるうちに、奇妙な振る舞いに出くわしました。

ご存知のように、静的メソッドはインスタンスではなくクラスに関連付けられているため、オーバーライドすることはできません。

ですから、以下のようなスニペットがあれば、うまくコンパイルされます。

//Snippet 1 - Compiles fine
public class A {
    static void ts() {
    }
}

class B extends A {
    static void ts() {
    }
}

しかし、クラスAの静的メソッドにfinal修飾子を付けると、コンパイルに失敗します。 B の ts() は A の ts() をオーバーライドできません。 .

staticメソッドは全くオーバーライドできないのに、なぜこのようなことが起こるのでしょうか?

どのように解決するのですか?

静的メソッドはオーバーライドできませんが、非表示にすることは可能です。そのため ts() メソッドはオーバーライドされません(ポリモーフィズムの対象ではありません)。 ts() をオーバーライドするわけではありませんが、それを隠蔽します。もしあなたが ts() を B で呼び出すと (NOT A.ts() または B.ts() ... ただ ts() ) の場合、Bのものが呼ばれ、Aは呼ばれません。これは多相性の対象ではないので、呼び出しは ts() の呼び出しはBのものにリダイレクトされることはありません。

キーワード final を指定すると、そのメソッドを非表示にすることができなくなります。そのため、非表示にすることはできず、非表示にしようとするとコンパイラーエラーが発生します。

これが役立つといいのですが。