可能性の重複:
Why doesn't Java allow overriding of static methods?静的メソッドを隠す正当な理由はありますか?
1は
オーバーライド
に派生クラスを望む理由は正当な理由があるの基底クラスのstatic
方法を非表示にするには?
可能性の重複:
Why doesn't Java allow overriding of static methods?静的メソッドを隠す正当な理由はありますか?
1は
オーバーライド
に派生クラスを望む理由は正当な理由があるの基底クラスのstatic
方法を非表示にするには?
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から削除してはいけません。
決して使用されるべきではないことに完全に同意します。ただし、*可能です*。合法的な現実の例を考えてみませんか?私のJavaのキャリアで私はそれらに遭遇したことはありません。 – BalusC
私はそれらのいずれかに遭遇したことがないので、珍しい人々が静的メソッドを "上書き"する必要があります。私は最初にそれを学んだと思う別のトリッキーな質問を検討するときhttp://stackoverflow.com/questions/6643648 – irreputable
+1の説明。しかし、これはまさに私が知りたいことは、論理的には(少なくとも私たちにとって)思わしくない場合、なぜ可能なのかを知りたいということです。 – Saket
静的メソッドは、メソッドをオーバーライドするために
をオーバーライドすることができない、この方法は、最初に継承されなければなりません。メソッドが継承されていない場合、オーバーライドする機会はありません。したがって、継承されていないプライベートメソッドをオーバーライドすることはできません。
オーバーライドできません。それらは隠すことができます。 – BalusC
このスレッドを見てください - http://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods – adatapost
@BalusCセマンティクス...に関係なく、私は誰も考えない実際にその質問に答えました。 – NullUserException