Help us understand the problem. What is going on with this article?

【Java】オーバーライドメモ

オーバーライド

オーバーライドとは、継承関係において
スーパークラスのメソッドの処理をサブクラスの同名のメソッドで重ねて処理結果を変えること」です。

継承関係以外では、この現象は起こりません が、継承するサブクラスを作成するときは、
多少スーパークラスのことを知らないと意図せずオーバーライドしてしまうことがありますので注意してください。

オーバーライドの仕組み

  1. スーパークラスがサブクラスのインスタンスに対してメソッドを呼び出す
  2. サブクラスの中でそのメソッドを探す
  3. 持っていればそのメソッドを呼び出す。

つまり 「スーパークラス と同名の メソッド がサブクラスにあれば、それが優先的に実行される。

つまりメソッド の内容が 上乗せされた」ような結果になります。

サンプルコード

こちらは継承元のスーパークラスです。

public class SuperOverride {
    public void testOverride() {
        System.out.println("オーバーライド前はこの表示が出ます");
    }

}

こちらはスーパークラスを継承したサブクラスです。

// スーパークラスを継承します
public class SubOverride extends SuperOverride {
    public void testOverride() {
//testOverrideメソッドをオーバーライドします。
        System.out.println("オーバーライドされるとこの表示になります");
    }
}

こちらのクラスで実行します。

public class Main {

    public static void main(String[] args) {
        SubOverride subor = new SubOverride();
        subor.testOverride();
    }

}

実行結果

オーバーライドされるとこの表示になります

上記のコードを解説すると

testOverrideメソッドを継承先のサブクラス SubOverride で上書きすることで、出力結果がオーバーライドされた内容になっています。

オーバーライドを回避する書き方(サンプル)

オーバーライドされていない出力をするならこのように記述します

// スーパークラスを継承します
public class SubOverride extends SuperOverride {
    public void testOverride() {
//testOverrideメソッドをオーバーライドします。

            //スーパークラスのtestOverride メソッドの呼び出し
        super.testOverride();
    }
}

コード内にもあるように
super キーワードを指定して」、 testOverride() メソッドを呼び出しています。
こうすることでスーパークラスであるSuperOverrideクラスのtestOverride() メソッドが呼び出されます。

オーバーライドの利用例

特定のサブクラスにおいて、当該メソッドの処理内容を修正・変更する という利用例があります。

「大本のスーパークラスに手を加えず、修正内容をサブクラスのみに適用したいとき」にオーバーライドは非常に便利だと思います。

とくに、RPGのキャラが行う特定のアクションを行う場合に、オーバーライドはよく用いられるようです。

すべてのキャラが固有で持っている 「attackメソッド」をオーバーライドして、

  • ナッシーは「ねむりごな」
  • ルージュラは「あくまのキッス」
  • ダグトリオは「じわれ」

といった具合で内容を上乗せします。

【Nassy.java】

    public void attack() {
        // ねむりごなの処理
    }

【kentaros.java】

    public void attack() {
        // はかいこうせんの処理を書く
    }

【Dugtrio.java】

    public void attack() {
        // じわれの処理を書く
    }

以上のように、それぞれ違う部分だけをプログラミングするだけで済むので、効率の良いコードを書けるようになると思います。

takahirocook
・30代未経験からエンジニア転職をした元調理師 ・ProgateのHTMLコースを一周し「エンジニア界のキング」の名でTwitterに爆誕。 ・「CSS完全に理解した」と女性に嘘ぶく ・共同開発でGitHubを破壊 【学習中】Java, PostgreSQL, HTML, CSS, Sass, JavaScript, jQuery,
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away