6

重複の可能性:
Java が静的メソッドのオーバーライドを許可しないのはなぜですか?

派生クラスが基本クラスのメソッドをオーバーライドして隠したい正当な理由はありますか?static

4

2 に答える 2

6

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

しかし、これはトラブルに他なりません。Tm() が別のメソッドを指しているため、暗黙のうちに Tm() の意味が変わると非常に危険です。(インスタンス メソッドはコントラクトを継承するので問題ありません。静的メソッドにはそのような理解はありません。)

したがって、この「機能」は決して使用しないでください。言語はそもそもそれを可能にするべきではありませんでした。

グッド プラクティス: Tm() を呼び出す場合、m() は T で宣言する必要があります。また、最初にすべての Tm() を削除せずに T から削除することはできません。

于 2011-09-23T04:40:20.860 に答える
4

静的メソッドはオーバーライドできません

メソッドをオーバーライドするには、まずメソッドを継承する必要があります。メソッドが継承されていない場合、オーバーライドする機会はありません。したがって、継承されないため、プライベート メソッドをオーバーライドすることはできません。

于 2011-09-23T04:27:41.793 に答える