カテゴリ: JavaSilver試験対策 更新日: 2026/03/27

Javaのオーバーライド完全解説!初心者向けの基礎知識と正しいルール

049
Javaのオーバーライド

先生と生徒の会話形式で理解しよう

生徒

「オーバーライドって具体的にどういうルールがありますか?」

先生

「オーバーライドは、スーパークラスのメソッドをサブクラスで再定義することです。引数の型や順番などいくつかの重要なルールがあります。詳しく見ていきましょう!」

1. オーバーライドとは?

1. オーバーライドとは?
1. オーバーライドとは?

Javaのオーバーライドとは、スーパークラス(親クラス)に定義されたメソッドをサブクラスで再定義することを指します。オーバーライドは、親クラスのメソッドをサブクラスでより具体的な処理に置き換えたいときに使用されます。

オーバーライドには次の重要なルールがあります:

  • メソッド名はスーパークラスと同じでなければならない。
  • 引数リスト(型、数、順番)がスーパークラスと完全に一致している必要がある。
  • 戻り値の型はスーパークラスと同じか、サブクラスである必要がある(共変戻り値)。
  • アクセス修飾子は、スーパークラスのメソッドと同じか、より広い範囲(例:protected → public)にする必要がある。
  • @Overrideアノテーションを付けて、コンパイル時にオーバーライドの正確性をチェックするのが推奨されます。

2. 基本的なオーバーライドの例

2. 基本的なオーバーライドの例
2. 基本的なオーバーライドの例

次のコードは、基本的なオーバーライドの例です:


class Parent {
    public void greet() {
        System.out.println("Hello from Parent!");
    }
}

class Child extends Parent {
    @Override
    public void greet() {
        System.out.println("Hello from Child!");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent obj = new Child();
        obj.greet(); // 出力: Hello from Child!
    }
}

このコードでは、ParentクラスのgreetメソッドがChildクラスでオーバーライドされています。実行時にはChildクラスのgreetメソッドが呼び出され、「Hello from Child!」と出力されます。

3. 共変戻り値の例

3. 共変戻り値の例
3. 共変戻り値の例

オーバーライドでは、戻り値の型が親クラスの型と完全に同じである必要はありません。戻り値の型が親クラスの型のサブクラスであれば許容されます。これを共変戻り値と呼びます。


class Animal {
    public Animal speak() {
        System.out.println("Animal sound");
        return new Animal();
    }
}

class Dog extends Animal {
    @Override
    public Dog speak() {
        System.out.println("Woof Woof!");
        return new Dog();
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        myDog.speak(); // 出力: Woof Woof!
    }
}

このコードでは、親クラスAnimalの戻り値型がAnimalであるのに対し、サブクラスDogは戻り値型にDogを指定しています。これは共変戻り値として正しくオーバーライドされています。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. アクセス修飾子とオーバーライド

4. アクセス修飾子とオーバーライド
4. アクセス修飾子とオーバーライド

オーバーライドでは、アクセス修飾子のルールも重要です。オーバーライドするメソッドのアクセス修飾子は、スーパークラスのメソッドよりも広い範囲にする必要があります。


class Parent {
    protected void display() {
        System.out.println("Protected method in Parent.");
    }
}

class Child extends Parent {
    @Override
    public void display() {
        System.out.println("Public method in Child.");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent obj = new Child();
        obj.display(); // 出力: Public method in Child.
    }
}

このコードでは、親クラスのdisplayメソッドがprotected修飾子を持つのに対し、サブクラスのdisplayメソッドはpublic修飾子を持っています。これは正しいオーバーライドです。

5. 試験対策ポイント

5. 試験対策ポイント
5. 試験対策ポイント
  • オーバーライドでは、引数リスト(型、数、順番)がスーパークラスと同じでなければならない。
  • 戻り値型は同じ型か、共変戻り値を使用できる。
  • アクセス修飾子は、スーパークラスのメソッドより広い範囲にする必要がある。
  • @Overrideアノテーションを使用して、コンパイル時に正確性をチェックする。

6. finalメソッドはオーバーライドできない

6. finalメソッドはオーバーライドできない
6. finalメソッドはオーバーライドできない

Javaでは、finalキーワードが付いたメソッドはオーバーライドすることができません。 finalは「これ以上変更できない」という意味を持つため、サブクラスでメソッドの実装を変更することは禁止されています。

次のコードを見てみましょう:


class Parent {
    public final void show() {
        System.out.println("This is a final method.");
    }
}

class Child extends Parent {

    // コンパイルエラーになる
    // public void show() {
    //     System.out.println("Trying to override.");
    // }
}

この例では、Parentクラスのshowメソッドがfinalで定義されているため、 Childクラスでオーバーライドすることはできません。

7. staticメソッドはオーバーライドではなく隠蔽される

7. staticメソッドはオーバーライドではなく隠蔽される
7. staticメソッドはオーバーライドではなく隠蔽される

staticメソッドはクラスに属するメソッドのため、通常のメソッドのようにオーバーライドされるわけではありません。 サブクラスで同じメソッドを定義した場合は「オーバーライド」ではなく「メソッドの隠蔽(method hiding)」と呼ばれます。

次の例を見てみましょう:


class Parent {
    public static void display() {
        System.out.println("Parent static method");
    }
}

class Child extends Parent {
    public static void display() {
        System.out.println("Child static method");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent obj = new Child();
        obj.display();
    }
}

この場合、呼び出されるメソッドは変数の型に依存します。 そのため、Parent型の変数を使用している場合は、 Parentクラスのdisplayメソッドが実行されます。

8. オーバーロードとの違い

8. オーバーロードとの違い
8. オーバーロードとの違い

オーバーライドとよく混同される概念に「オーバーロード」があります。 これらは似ているように見えますが、まったく異なる仕組みです。

  • オーバーライド:継承関係にあるクラスで、同じメソッドを再定義する。
  • オーバーロード:同じクラス内で、引数リストが異なる同名メソッドを複数定義する。

次のコードはオーバーロードの例です:


class Calculator {

    public int add(int a, int b) {
        return a + b;
    }

    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

このように、メソッド名は同じでも引数の数や型が異なる場合は、 オーバーライドではなくオーバーロードになります。 Javaの試験でもよく問われる重要なポイントです。

まとめ

まとめ
まとめ

オーバーライドは、Javaでオブジェクト指向プログラミングを実践する上で欠かせない技術です。親クラスで定義されたメソッドを、サブクラスで再定義することで、柔軟で再利用性の高いコードを実現できます。今回解説したように、引数リストや戻り値型、アクセス修飾子のルールを正確に理解することが、正しいオーバーライドを行う鍵となります。また、@Overrideアノテーションを活用することで、間違いを未然に防ぐことも重要です。

さらに、共変戻り値を活用すると、親クラスとサブクラスの設計をより効果的に行うことができます。試験対策としても、今回のポイントをしっかりと復習し、実践に活かしてみてください。

先生と生徒の振り返り会話

生徒

「オーバーライドのルールを詳しく理解できました!共変戻り値って便利なんですね。」

先生

「そうです。特に、親クラスとサブクラスの設計が複雑になるほど、共変戻り値はコードの柔軟性を高めてくれます。」

生徒

「あと、アクセス修飾子のルールも勉強になりました。親クラスより狭い範囲にできないんですね。」

先生

「その通りです。このルールを覚えておけば、コンパイルエラーを未然に防げますよ。どんどん実践してみてください!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaのオーバーライドとは具体的にどのような機能ですか?初心者にわかりやすく教えてください。

Javaのオーバーライドとは、オブジェクト指向プログラミングにおける重要な概念の一つで、スーパークラス(親クラス)で定義されているメソッドを、その継承先であるサブクラス(子クラス)において、全く同じメソッド名で再定義することを指します。オーバーライドを活用することで、親クラスが持っている一般的な共通の振る舞いを、子クラス側でより具体的、あるいは特別な独自の処理内容に書き換えることが可能になります。例えば、「動物」という親クラスにある「鳴く」というメソッドを、「犬」という子クラスでは「ワンワン」と鳴くように具体的な処理として置き換えるのがオーバーライドの役割です。これにより、プログラムの柔軟性と再利用性が大幅に向上します。
JavaSilver試験対策の一覧へ
新着記事
Flutter
Flutterでのリポジトリパターンの実装例
Flutterでリポジトリパターンを実装する方法を完全解説!初心者向けアーキテクチャ設計入門
Java
Java の Objects クラスを使って null チェックを簡単にする方法
JavaのObjectsクラスの使い方を完全ガイド!nullチェックを簡単・安全に行う方法
Java
Java の UUID クラスを使って一意の識別子を作成する方法
JavaのUUIDクラスの使い方を完全ガイド!初心者でもわかる一意な識別子の作成方法
Java
Java の古い日付クラス(Date, Calendar)と新しい日付 API の違い
JavaのDateとCalendarと新しい日付APIの違いとは?初心者向け完全ガイド
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク