オブジェクト、クラス、インタフェース |
サブクラスは、継承するメソッドの実装を完全にオーバーライドすることができる。あるいは、サブクラスは機能性を追加することによりメソッドの質を高めることができる。スーパークラスのメソッド実装の置換
サブクラスは、メソッドのスーパークラスの実装を完全に置換することを望むことがある。 確かに、すべてではないとしてもほとんどのサブクラスが完全にメソッドのスーパークラスの実装を置換するとものとして、空のメソッド実装を多くのスーパークラスが提供する。この一例が Thread クラスの
run()
メソッドである。 定義によってrun()
メソッドがサブクラスに依存するので、 Thread クラスはrun()
メソッドについて空の実装(メソッドは何も行わない)を提供する。 Thread クラスは、run()
メソッドに妥当なデフォルトの実装を提供することができない。 しかし、Thread クラスが abstract なのも意味をなさないので、run()
メソッドは抽象的であるはずがない(プログラマはサブクラスを構築しないで一般的な Thread をインスタンス化することができなければならない)。 したがって、run()
の実装は空である。完全にスーパークラスのメソッド実装を置換するためには、メソッドにスーパークラスメソッドと同じものを指定して、オーバーライドされたメソッドと同じシグニチャをオーバーライドするメソッドに提供する。
BackgroundThread クラスはそのスーパークラス Thread からclass BackgroundThread extends Thread { void run() { . . . } }run()
メソッドをオーバーライドして、完全に Thread の実装を置換する。スーパークラスのメソッド実装への追加
サブクラスがメソッドのスーパークラスの実装を保持したいが、サブクラスに振る舞いが指定されているという状態で、さらに質を高めることを要求する場合がある。 例えば、サブクラス内のコンストラクタメソッドが一般にこれを行う。 サブクラスはスーパークラスが行った初期化を保持するが、サブクラスに指定された追加の初期化を提供することを要求する。java.awt パッケージで Window クラスのサブクラスを作成すると仮定する。 Window クラスはウィンドウの親である Frame 引数を必要とするコンストラクタを持っている。
このコンストラクタが、ウィンドウシステム内で動作するウィンドウで初期化を実行する。 Windowの新規のサブクラスがウィンドウシステムでも動作することを確実にするために、同じ初期化を実行するWindowサブクラスにもコンストラクタを提供しなくてはならない。 Window コンストラクタで発生する初期化プロセスを計算して再現しようと試みるよりも、Window クラスがすでに行うものを使用するであろう。 Windowサブクラスコンストラクタの中から呼び出すだけで、Windowコンストラクタでコードに影響を与えることができる。public Window(Frame parent)class RoundWindow extends Window { public RoundWindow(Frame parent) { super(parent); . . . // RoundWindow specific initialization here . . . } }RoundWindow()
コンストラクタは、他のことを行う前に、最初にスーパークラスのコンストラクタを呼び出す。 一般に、これはコンストラクタで望まれる振る舞いである。スーパークラスはサブクラスの前に、すべての初期化を実行する機会を得るべきである。 他のタイプのメソッドが、サブクラスのメソッドの終了時点、あるいはその真ん中で、スーパークラスのメソッドの実装を呼び出すことを要求することがある。 スーパークラスのメソッドの呼び出しの位置が、サブクラスのメソッドをうまく操作するのに重大であるなら、コメントでそれを注意することは重要である。サブクラスがオーバーライドできないメソッド
- サブクラスは、スーパークラスで
final
と宣言されたメソッドをオーバーライドすることができない(定義によって、 final メソッドはオーバーライドされることができない)。 final メソッドをオーバーライドしようとすると、コンパイラは以下に類似したエラーメッセージを表示して、プログラムをコンパイルすることを拒否する。final メソッドの解説については、 Final クラスとメソッドの書き方を参照のこと。
FinalTest.java:7: Final methods can't be overriden.
Method void iamfinal() is final in class ClassWithFinalMethod.
void iamfinal() {
^
1 error
- 同様に、サブクラスはスーパークラスで
static
と宣言されたメソッドをオーバーライドすることができない。 言い替えれば、サブクラスはクラスメソッドをオーバーライドすることができない。 クラスメソッドの説明のについては、 インスタンスとクラスメンバ を参照のこと。サブクラスがオーバーライドしなければならないメソッド
サブクラスは、スーパークラスでabstract
と宣言されたメソッドをオーバーライドしなくてはならない。あるいはサブクラスはabstractでなければならない。Abstract クラスとメソッドの書き方 では、詳細に abstract クラスとメソッドについて説明する。
オブジェクト、クラス、インタフェース |