カテゴリ: Javaの継承 更新日: 2026/08/08

Java の継承の制約を完全解説!final クラスや final メソッドの扱いを初心者向けにやさしく解説

136
Java の継承の制約(final クラスや final メソッドの扱い)

新人と先輩の会話形式で理解しよう

新人

「Javaでクラスを継承できないって聞いたんですけど、本当ですか?」

先輩

「うん、本当だよ。finalクラスっていう特別なクラスは、継承できないように作られているんだ。」

新人

「じゃあ、どういうときにfinalクラスを使うんですか?」

先輩

「よし、今日はJavaの継承の制約について、finalクラスやfinalメソッドの基本を一緒に見ていこう!」

1. Javaの継承ってなに?(基本の復習)

1. Javaの継承ってなに?(基本の復習)
1. Javaの継承ってなに?(基本の復習)

Javaの継承とは、すでにあるクラス(これを親クラスといいます)の機能を引き継いで、新しいクラス(子クラス)を作る仕組みのことです。

たとえば、動物を表すAnimalという親クラスを作って、その子クラスとしてDogCatを作れば、Animalに書いた共通の処理をDogCatでも使えます。


public class Animal {
    void speak() {
        System.out.println("鳴きます");
    }
}

public class Dog extends Animal {
    void bark() {
        System.out.println("ワンワン!");
    }
}

このように、子クラスは親クラスのspeak()メソッドも使えるようになります。これがJavaの継承の基本的な考え方です。

2. 継承できないクラスとは?(finalクラスの意味)

2. 継承できないクラスとは?(finalクラスの意味)
2. 継承できないクラスとは?(finalクラスの意味)

Javaでは、特定のクラスを継承できないようにする方法があります。それがfinalを使ったクラスです。finalクラスとは、「これ以上子クラスを作らせたくない」ときに使います。

finalをつけたクラスは、そのクラスをもとにした子クラスを作ろうとするとエラーになります。


public final class Calculator {
    public void add(int a, int b) {
        System.out.println(a + b);
    }
}

// 下のように継承しようとするとエラーになる
// public class AdvancedCalculator extends Calculator {
//     // エラー!Calculatorはfinalなので継承できない
// }

このように、finalクラス継承の制約がある特別なクラスです。

なぜこんな制約があるのかというと、そのクラスがとても大事で、勝手に動きを変えてほしくない場合に使うからです。

たとえば、安全性が大事なクラスや、ライブラリの内部処理などでは、finalを使って設計されることがあります。

3. finalメソッドとは?(上書きできないメソッド)

3. finalメソッドとは?(上書きできないメソッド)
3. finalメソッドとは?(上書きできないメソッド)

Javaでは、メソッドにもfinalをつけることができます。finalメソッドとは、子クラスで上書き(オーバーライド)できないメソッドのことです。

たとえば、親クラスで定めた重要な処理を、子クラスで勝手に変えてほしくないときに使います。


public class Animal {
    public final void eat() {
        System.out.println("ごはんを食べます。");
    }
}

public class Dog extends Animal {
    // public void eat() { // これはエラーになります!
    //     System.out.println("ドッグフードを食べます。");
    // }
}

このように、finalメソッドを上書きしようとすると、Javaがエラーを出して教えてくれます。

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

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

※ Amazon広告リンク

4. finalクラス・finalメソッドの使いどころ

4. finalクラス・finalメソッドの使いどころ
4. finalクラス・finalメソッドの使いどころ

Javaのfinalキーワードは、クラスにもメソッドにも使えます。そして、それぞれ使いどころがあります。

finalクラスは、「これ以上変更されたくないクラス」に使います。たとえば、セキュリティに関わる処理や、ライブラリなどの安全な動きを守るときに便利です。

finalメソッドは、「子クラスで動きを変えてはいけないメソッド」に使います。たとえば、ログを出力する処理や、正確に動かす必要がある計算などです。

実際にJavaの標準クラスでも、StringクラスやMathクラスなどには、finalが使われていることがあります。これは、動きが固定されていて、変更してはいけないことを示しているのです。

5. オーバーライドとの違いを確認しよう

5. オーバーライドとの違いを確認しよう
5. オーバーライドとの違いを確認しよう

Javafinalオーバーライドは、正反対の考え方を持っています。オーバーライドは「親クラスの動きを子クラスで変えること」、finalは「親クラスの動きを変えられないようにすること」です。

たとえば、オーバーライドできると、子クラスで自由に書き換えられますが、finalを使うとそれができなくなります。


public class Parent {
    public void greet() {
        System.out.println("こんにちは、親クラスです。");
    }
}

public class Child extends Parent {
    @Override
    public void greet() {
        System.out.println("こんにちは、子クラスです。");
    }
}

こんにちは、子クラスです。

これはオーバーライドの例です。親のメソッドを子が書き換えて、新しい動きをさせています。

一方、finalをつけるとこうなります。


public class Parent {
    public final void greet() {
        System.out.println("こんにちは、親クラスです。");
    }
}

public class Child extends Parent {
    // @Override
    // public void greet() { // エラーになります!
    //     System.out.println("こんにちは、子クラスです。");
    // }
}

このように、finalをつけることで、オーバーライドを禁止できるのです。

Javaでは、クラスやメソッドが増えてくると、うっかり動きを変えてしまうことがあります。そういったミスを防ぐためにも、finalの使い方を覚えておくと安心です。

6. finalの使い方でよくある間違い

6. finalの使い方でよくある間違い
6. finalの使い方でよくある間違い

Javafinalキーワードは便利ですが、間違って使うとエラーになったり、意図しない動きになることがあります。

まず、finalをつけたあとでそのクラスやメソッドを変更しようとするとエラーになります。たとえば、finalメソッドを上書きしたり、finalクラスを継承しようとするのはNGです。


public final class Vehicle {
    public void run() {
        System.out.println("走行中");
    }
}

// エラーになる継承
// public class Car extends Vehicle {
// }

このようにfinalの意味を知らずに継承しようとすると、Javaのルールに反するため、Pleiadesのエラー表示で気づくことになります。

また、finalメソッドをうっかりオーバーライドしようとすることもよくあります。


public class Animal {
    public final void sleep() {
        System.out.println("眠ります。");
    }
}

// public class Cat extends Animal {
//     public void sleep() { // エラーになります!
//         System.out.println("ネコが寝ています。");
//     }
// }

エラーの原因がfinalによる制約だったということを知っておくと、こうしたミスも防ぎやすくなります。

7. 初心者がfinalを正しく使うコツ

7. 初心者がfinalを正しく使うコツ
7. 初心者がfinalを正しく使うコツ

初心者のうちはfinalの使いどころが分からず、なんとなく使わないということも多いですが、実はとても役立つキーワードです。

どのタイミングで使うと良いかのポイントは次の通りです。

  • クラス:継承されたくないときにfinalをつける
  • メソッド:動きを固定したいときにfinalをつける

たとえば、学校の「出席番号」を自動で表示するクラスを作ったとします。これはfinalで固定しておくと、誰かに勝手に継承されて書き換えられる心配がありません。


public final class Attendance {
    public void printNumber() {
        System.out.println("出席番号を表示します。");
    }
}

あとから変更されないようにしておくことは、プログラムの安全性を高める上でとても大切な考え方です。

8. 継承とfinalを使った簡単な設計例

8. 継承とfinalを使った簡単な設計例
8. 継承とfinalを使った簡単な設計例

Javaのfinal継承を組み合わせることで、わかりやすく、安全なクラス設計ができます。ここでは、図書館のシステムを例に考えてみましょう。

まず、LibraryItemという親クラスを作り、本や雑誌などを表す子クラスを作ります。そして、LibraryItemfinalメソッドを使って、絶対に変えてはいけない処理(たとえば、共通のIDを表示する処理)を固定します。


public class LibraryItem {
    public final void showID() {
        System.out.println("共通のIDを表示します。");
    }

    public void describe() {
        System.out.println("図書館の資料です。");
    }
}

public class Book extends LibraryItem {
    @Override
    public void describe() {
        System.out.println("これは本です。");
    }
}

public class Magazine extends LibraryItem {
    @Override
    public void describe() {
        System.out.println("これは雑誌です。");
    }
}

このようにしておけば、IDの表示方法は固定しつつ、それぞれの資料の説明だけを変えることができます。

Javaのfinalと継承の仕組みをうまく組み合わせることで、安全で管理しやすいプログラムが書けるようになります。

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

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

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

Javaの継承とは、プログラミング初心者にとって具体的にどのような仕組みだと理解すれば良いでしょうか?

Javaの継承とは、既にある「親クラス(スーパークラス)」の持っている性質や機能、つまりフィールドやメソッドといった処理の内容を、「子クラス(サブクラス)」がそのまま引き継ぐことができる非常に便利な仕組みです。例えば、動物という大きな共通点を持つ「Animalクラス」を親として作成し、それを継承して「Dogクラス」や「Catクラス」を作ることで、共通の振る舞いを何度も書く必要がなくなります。これにより、プログラムのコードの再利用性が高まり、効率的な開発が可能になります。記事内でも紹介されている通り、「extends」というキーワードを使って継承を表現するのがJavaの基本ルールとなっています。

Javaでクラスを継承させたくない場合、どのような設定を行えば良いのでしょうか?

特定のクラスを他のクラスに継承させたくない、つまり「これ以上子クラスを作らせたくない」という場合には、クラスの宣言時に「final」キーワードを付与して「finalクラス」として定義します。Javaの文法において、finalがついたクラスは、それ自体が完成形であることを意味しており、別のクラスがそのクラスを親として「extends」しようとすると、コンパイルエラーが発生してプログラムが実行できなくなります。これは、プログラムの設計上、勝手に機能を拡張されたり、内部のロジックを書き換えられたりすることを防ぐための強力な制約となります。
Javaの継承の一覧へ
新着記事
Flutter
FlutterでWebアプリをビルドする方法と注意点
FlutterでWebアプリをビルドする方法と注意点を徹底解説【初心者向け】
Flutter
Flutter Web開発の始め方!環境構築と基本の流れ
Flutter Web開発の始め方を完全ガイド!初心者でもわかる環境構築と基本の流れ
Flutter
FlutterのInheritedWidgetとは?仕組みと活用方法
FlutterのInheritedWidgetとは?仕組みと活用方法を初心者向けにやさしく解説
Flutter
Blocパターンの仕組みと導入方法をわかりやすく解説
FlutterのBlocパターンを完全ガイド!初心者でもわかる状態管理と導入方法
人気記事
Flutter
Flutterの開発に必要なもの!パソコン・ツール・OSなど準備まとめ
Flutterの開発に必要なもの!パソコン・ツール・OSなど準備まとめ
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説

🔌 USBポート不足を解消

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

UGREEN USB-Cハブを見る

※ Amazon広告リンク