2011-09-23 8 views
6

可能性の重複:
Why doesn't Java allow overriding of static methods?静的メソッドを隠す正当な理由はありますか?

1は オーバーライド に派生クラスを望む理由は正当な理由があるの基底クラスのstatic方法を非表示にするには?

+5

オーバーライドできません。それらは隠すことができます。 – BalusC

+0

このスレッドを見てください - http://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods – adatapost

+0

@BalusCセマンティクス...に関係なく、私は誰も考えない実際にその質問に答えました。 – NullUserException

答えて

6

Javaでの静的メソッドは、バイナリ互換性セクション13.4.12で暗黙のようなオーバーライド関係を持っています。 TがSを拡張し、Sがm()を宣言した場合、T()はTで宣言されているかどうかによって、TまたはS内のメソッドを参照できます。 T.m()を呼び出すコードを壊すことなく、Tからm()を追加または削除しても問題ありません。 (これは、JVMのinvokestatic命令が、スーパークラスチェーンを一種の動的メソッドルックアップを行うことを意味します)。

しかし、これは問題ではありません。 T.m()の意味が黙って変わると、これは別の方法を指しているので本当に危険です。 (インスタンスメソッドは、問題ではないように契約を継承しますが、静的メソッドではそのような理解はありません)。

この「機能」は決して使用しないでください。言語はそれを最初から有効にすべきではありませんでした。

T.m()を呼び出す場合、m()はTで宣言する必要があります。最初にすべてのT.m()を削除しないでTから削除してはいけません。

+0

決して使用されるべきではないことに完全に同意します。ただし、*可能です*。合法的な現実の例を考えてみませんか?私のJavaのキャリアで私はそれらに遭遇したことはありません。 – BalusC

+0

私はそれらのいずれかに遭遇したことがないので、珍しい人々が静的メソッドを "上書き"する必要があります。私は最初にそれを学んだと思う別のトリッキーな質問を検討するときhttp://stackoverflow.com/questions/6643648 – irreputable

+0

+1の説明。しかし、これはまさに私が知りたいことは、論理的には(少なくとも私たちにとって)思わしくない場合、なぜ可能なのかを知りたいということです。 – Saket

4

静的メソッドは、メソッドをオーバーライドするために

をオーバーライドすることができない、この方法は、最初に継承されなければなりません。メソッドが継承されていない場合、オーバーライドする機会はありません。したがって、継承されていないプライベートメソッドをオーバーライドすることはできません。