Javaの抽象クラスとは?共通処理と必ず作る処理を親クラスで決める考え方

最終更新日

Schoo Java入門 初級【2026年版】第7回 継承とインターフェース

本記事は、Schooの「Java入門 初級【2026年版】」第7回「継承とインターフェース」を学ぶ前後に、Javaの抽象クラスの考え方を整理したい方向けのステップアップ学習記事です。

ただし、Schooを受講していない方でも、クラス、継承、オーバーライドの基本を学んだあとに読み進められる内容にしています。

Schoo コースページ:Java入門 初級【2026年版】

抽象クラスは、継承して使うことを前提にした親クラスです。共通する処理を親クラスに書きつつ、子クラスごとに必ず作ってほしい処理を決められます。

抽象クラスは継承して使うための親クラス

抽象クラスは abstract class と書いて作ります。通常のクラスと同じようにフィールドやメソッドを持てますが、抽象クラス自体をそのまま new することはできません。

public abstract class User {
    protected String name;

    public User(String name) {
        this.name = name;
    }

    public void printName() {
        System.out.println("名前:" + name);
    }
}

この User クラスは抽象クラスです。名前を持つことや、名前を表示する処理は、ユーザーの種類が違っても共通で使えます。

図解:抽象クラスはそのままnewできない
オブジェクトを作るときの違い
User user = new User();
User user = new AdminUser(“山田”);
抽象クラスは、子クラスを作るための土台です。直接 new するのではなく、具体的な子クラスを new します。
abstract class は、そのまま使う完成品ではなく、継承して使うための親クラスです。

共通処理は抽象クラスに書ける

抽象クラスには、子クラスで共通して使いたい処理を書けます。たとえば、printName はどのユーザーでも同じように使う処理として親クラスに置けます。

public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
    }
}

AdminUser user = new AdminUser("山田");
user.printName();

AdminUserUser を継承しているため、User に書かれた printName を呼び出せます。これは通常の継承と同じ考え方です。

抽象メソッドで必ず作る処理を決められる

抽象クラスでは、処理の中身を書かずにメソッドの形だけを決めることがあります。これを抽象メソッドと呼びます。

public abstract class User {
    protected String name;

    public User(String name) {
        this.name = name;
    }

    public void printName() {
        System.out.println("名前:" + name);
    }

    public abstract String getRoleName();
}

getRoleName は、戻り値が String のメソッドとして宣言されています。ただし、{ } の中身はありません。子クラスで具体的な処理を書く前提のメソッドです。

図解:抽象クラスは共通処理と必ず作る処理をまとめる
抽象クラス User
public abstract class User {
  String name;
  public void printName() {
    System.out.println(name);
  }
  public abstract String
    getRoleName();
}
子クラスで
具体化
共通処理
printName() は、子クラスでそのまま使えます。
必ず作る処理
getRoleName() は、子クラスで中身を作ります。
抽象クラスでは、共通部分を親に置き、子クラスごとに違う部分を抽象メソッドとして決められます。

子クラスは抽象メソッドをオーバーライドする

抽象メソッドを持つ抽象クラスを継承した場合、子クラスではその抽象メソッドをオーバーライドして実装します。

public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
    }

    @Override
    public String getRoleName() {
        return "管理者";
    }
}

AdminUser では、getRoleName の中身を具体的に書いています。親クラスで「このメソッドは必要」と決め、子クラスで「具体的に何を返すか」を作る流れです。

図解:子クラスは抽象メソッドをオーバーライドして完成させる
親で決める
public abstract String
  getRoleName();
メソッド名と戻り値を決め、処理の中身は書きません。
子クラスで
実装
子で作る
@Override
public String getRoleName() {
  return “管理者”;
}
子クラスに合わせて、具体的な処理を書きます。
抽象メソッドは、子クラスで必ず作る処理を親クラス側で決めるために使います。

抽象クラス自体はnewできない

抽象クラスは、子クラスに継承して使うためのクラスです。そのため、抽象クラスそのものを new することはできません。

User user = new User("山田"); // エラー

User admin = new AdminUser("山田");
admin.printName();
System.out.println(admin.getRoleName());

new User("山田") はできません。一方、AdminUser は具体的な子クラスなので new できます。変数の型を User にして、実体として AdminUser を入れることはできます。

抽象クラスを使う場面

抽象クラスは、複数の子クラスに共通する処理があり、さらに子クラスごとに必ず作ってほしい処理もある場合に使います。

  • 共通のフィールドを親クラスにまとめたい
  • 共通のメソッドを親クラスにまとめたい
  • 子クラスごとに違う処理を必ず作らせたい

インターフェースも「必ず作る処理」を決める仕組みとして使われますが、抽象クラスは共通のフィールドや共通処理も一緒に持てる点が特徴です。インターフェースとの違いは、別の記事で整理します。

確認問題

  1. abstract class User と書いたクラスは、そのまま new User() できますか。
  2. 抽象クラスに共通処理を書くと、子クラスではどのように使えますか。
  3. public abstract String getRoleName(); のような抽象メソッドは、子クラスで何をする必要がありますか。

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

あわせて読みたい関連記事

まとめ

Javaの抽象クラスは、継承して使うことを前提にした親クラスです。共通処理を親クラスにまとめながら、子クラスで必ず作る処理を抽象メソッドとして決められます。抽象クラスそのものは new できないため、具体的な子クラスを作って利用します。

シェアする