🎯

【Java】クラス解説17・オーバーライド

2024/01/15に公開

オーバーライドについて

オーバーライドとは、スーパークラスのメソッド等をサブクラスで上書きし、処理内容を書き換える事を言います。
オーバーライドには、以下のルールがあります。

  1. サブクラスのオーバーライドするメソッド等のアクセス修飾子は、スーパークラスのメソッド等のアクセス修飾子より下げることはできません。


スーパークラスのメソッド等のアクセス修飾子 → protected の場合は、
サブクラスのメソッド等のアクセス修飾子 → protected 又は public にしなければならない。

  1. サブクラスのオーバーライドするメソッドは、以下の要件が求められます。
  • スーパークラスのメソッドとメソッド名が一致すること。
  • スーパークラスのメソッドと引数の型と引数の個数が一致すること。
  • スーパークラスのメソッドと戻り値の型が一致すること
  1. スーパークラスのfinal、static、およびprivateメソッドはオーバーライドできません。
  • final修飾子は、メソッドをオーバーライドするのを防ぐため。
  • staticなメソッドはクラスに紐づいており、インスタンスごとではなくクラス自体に関連しているので、オーバーライドが不可能なため。
  • privateは、他クラス(サブクラス)からアクセスできなくなるため。
  1. スーパークラスのメソッドが例外をスローする場合、サブクラスのメソッドでその例外の親クラスをスローしてはいけません。

https://zenn.dev/goriki/articles/005-about-methods

オーバーライドのコード例

public class Main {
    public static void main(String[] args) {
        // インスタンス生成
        SubClass sb = new SubClass();
        // サブクラスのインスタンスからオーバーライドされたprintメソッドの呼び出し
        sb.print("fuzi"); // 出力結果 -> 標準出力にfuziが出力されました
    }
}
class MyClass {
    // スーパークラスのprintメソッド
    public void print(String name) {
        System.out.println(name + "が出力されました");
    }
}
class SubClass extends MyClass {
    // サブクラスでスーパークラスのprintメソッドを上書き(オーバーライド)
    public void print(String name) {
        System.out.println("標準出力に" + name + "が出力されました");
    }
}

オーバーライドのコード例の解説

public class Main {
    public static void main(String[] args) {
        SubClass sb = new SubClass();
        sb.print("fuzi");
    }
}

Mainクラスで、

  1. サブクラスのインスタンスsbを生成します。
  2. サブクラスのインスタンスでオーバーライドされたprintメソッドを呼び出し、実引数fuziを渡します。

class MyClass {
    public void print(String name) {
        System.out.println(name + "が出力されました");
    }
}

MyClassというクラスを定義して、

  1. publicな戻り値のない(void)メソッドprintを定義して、渡されたfuziを仮引数で受け取り、
  2. fuziを受け取った仮引数と文字列を標準出力に出力します。

class SubClass extends MyClass {
    public void print(String name) {
        System.out.println("標準出力に" + name + "が出力されました");
    }
}

MyClassを継承したSubClassを定義して、

  1. スーパークラスのprintメソッドをオーバーライドします。
  2. 処理内容を上書きして、標準出力に出力します。

Discussion