Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース


メソッドのオーバーライド

サブクラスは、継承するメソッドの実装を完全にオーバーライドすることができる。あるいは、サブクラスは機能性を追加することによりメソッドの質を高めることができる。

スーパークラスのメソッド実装の置換

サブクラスは、メソッドのスーパークラスの実装を完全に置換することを望むことがある。 確かに、すべてではないとしてもほとんどのサブクラスが完全にメソッドのスーパークラスの実装を置換するとものとして、空のメソッド実装を多くのスーパークラスが提供する。

この一例が Thread クラスの run() メソッドである。 定義によって run() メソッドがサブクラスに依存するので、 Thread クラスは run() メソッドについて空の実装(メソッドは何も行わない)を提供する。 Thread クラスは、 run() メソッドに妥当なデフォルトの実装を提供することができない。 しかし、Thread クラスが abstract なのも意味をなさないので、 run() メソッドは抽象的であるはずがない(プログラマはサブクラスを構築しないで一般的な Thread をインスタンス化することができなければならない)。 したがって、 run() の実装は空である。

完全にスーパークラスのメソッド実装を置換するためには、メソッドにスーパークラスメソッドと同じものを指定して、オーバーライドされたメソッドと同じシグニチャをオーバーライドするメソッドに提供する。

class BackgroundThread extends Thread {
    void run() {
        . . .
    }
}

BackgroundThread クラスはそのスーパークラス Thread から run() メソッドをオーバーライドして、完全に Thread の実装を置換する。

スーパークラスのメソッド実装への追加

サブクラスがメソッドのスーパークラスの実装を保持したいが、サブクラスに振る舞いが指定されているという状態で、さらに質を高めることを要求する場合がある。 例えば、サブクラス内のコンストラクタメソッドが一般にこれを行う。 サブクラスはスーパークラスが行った初期化を保持するが、サブクラスに指定された追加の初期化を提供することを要求する。

java.awt パッケージで Window クラスのサブクラスを作成すると仮定する。 Window クラスはウィンドウの親である Frame 引数を必要とするコンストラクタを持っている。

public Window(Frame parent)

このコンストラクタが、ウィンドウシステム内で動作するウィンドウで初期化を実行する。 Windowの新規のサブクラスがウィンドウシステムでも動作することを確実にするために、同じ初期化を実行するWindowサブクラスにもコンストラクタを提供しなくてはならない。 Window コンストラクタで発生する初期化プロセスを計算して再現しようと試みるよりも、Window クラスがすでに行うものを使用するであろう。 Windowサブクラスコンストラクタの中から呼び出すだけで、Windowコンストラクタでコードに影響を与えることができる。

class RoundWindow extends Window {
    public RoundWindow(Frame parent) {
        super(parent);
        . . .
            // RoundWindow specific initialization here
        . . .
    }
}

RoundWindow() コンストラクタは、他のことを行う前に、最初にスーパークラスのコンストラクタを呼び出す。 一般に、これはコンストラクタで望まれる振る舞いである。スーパークラスはサブクラスの前に、すべての初期化を実行する機会を得るべきである。 他のタイプのメソッドが、サブクラスのメソッドの終了時点、あるいはその真ん中で、スーパークラスのメソッドの実装を呼び出すことを要求することがある。 スーパークラスのメソッドの呼び出しの位置が、サブクラスのメソッドをうまく操作するのに重大であるなら、コメントでそれを注意することは重要である。

サブクラスがオーバーライドできないメソッド

サブクラスがオーバーライドしなければならないメソッド

サブクラスは、スーパークラスで abstract と宣言されたメソッドをオーバーライドしなくてはならない。あるいはサブクラスはabstractでなければならない。Abstract クラスとメソッドの書き方 では、詳細に abstract クラスとメソッドについて説明する。


Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース