静的メソッドの修飾子をいろいろ試していたところ、奇妙な動作に遭遇しました。
ご存知のとおり、静的メソッドはインスタンスではなくクラスに関連付けられているため、オーバーライドすることはできません。
以下のスニペットがあれば、問題なくコンパイルされます
//Snippet 1 - Compiles fine
public class A {
static void ts() {
}
}
class B extends A {
static void ts() {
}
}
しかし、クラスAの静的メソッドにfinal修飾子を含めると、コンパイルは失敗します。B の ts() は A の ts() をオーバーライドできません。オーバーライドされたメソッドは static final です。。
静的メソッドをまったくオーバーライドできないのに、なぜこのようなことが起こるのでしょうか?
ベストアンサー1
静的メソッドはオーバーライドできませんが、非表示にすることはできます。Bts()
のメソッドは A のメソッドをオーバーライドしません (ポリモーフィズムの対象ではありません)ts()
が、非表示にします。B を呼び出す場合ts()
(NOTA.ts()
またはB.ts()
... のみts()
)、B のメソッドが呼び出され、A のメソッドは呼び出されません。これはポリモーフィズムの対象ではないため、ts()
A の呼び出しが B のメソッドにリダイレクトされることはありません。
キーワードはfinal
メソッドの非表示を無効にします。そのため、メソッドを非表示にすることはできず、非表示にしようとするとコンパイラ エラーが発生します。