派生クラスが基本クラスのメソッドをオーバーライドして隠したい正当な理由はありますか?static
2 に答える
用語はさておき、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 から削除することはできません。
静的メソッドはオーバーライドできません
メソッドをオーバーライドするには、まずメソッドを継承する必要があります。メソッドが継承されていない場合、オーバーライドする機会はありません。したがって、継承されないため、プライベート メソッドをオーバーライドすることはできません。