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

本記事は、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 するのではなく、具体的な子クラスを new します。
abstract class は、そのまま使う完成品ではなく、継承して使うための親クラスです。共通処理は抽象クラスに書ける
抽象クラスには、子クラスで共通して使いたい処理を書けます。たとえば、printName はどのユーザーでも同じように使う処理として親クラスに置けます。
public class AdminUser extends User {
public AdminUser(String name) {
super(name);
}
}
AdminUser user = new AdminUser("山田");
user.printName();
AdminUser は User を継承しているため、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 のメソッドとして宣言されています。ただし、{ } の中身はありません。子クラスで具体的な処理を書く前提のメソッドです。
具体化
printName() は、子クラスでそのまま使えます。
getRoleName() は、子クラスで中身を作ります。
子クラスは抽象メソッドをオーバーライドする
抽象メソッドを持つ抽象クラスを継承した場合、子クラスではその抽象メソッドをオーバーライドして実装します。
public class AdminUser extends User {
public AdminUser(String name) {
super(name);
}
@Override
public String getRoleName() {
return "管理者";
}
}
AdminUser では、getRoleName の中身を具体的に書いています。親クラスで「このメソッドは必要」と決め、子クラスで「具体的に何を返すか」を作る流れです。
実装
抽象クラス自体はnewできない
抽象クラスは、子クラスに継承して使うためのクラスです。そのため、抽象クラスそのものを new することはできません。
User user = new User("山田"); // エラー
User admin = new AdminUser("山田");
admin.printName();
System.out.println(admin.getRoleName());
new User("山田") はできません。一方、AdminUser は具体的な子クラスなので new できます。変数の型を User にして、実体として AdminUser を入れることはできます。
抽象クラスを使う場面
抽象クラスは、複数の子クラスに共通する処理があり、さらに子クラスごとに必ず作ってほしい処理もある場合に使います。
- 共通のフィールドを親クラスにまとめたい
- 共通のメソッドを親クラスにまとめたい
- 子クラスごとに違う処理を必ず作らせたい
インターフェースも「必ず作る処理」を決める仕組みとして使われますが、抽象クラスは共通のフィールドや共通処理も一緒に持てる点が特徴です。インターフェースとの違いは、別の記事で整理します。
確認問題
abstract class Userと書いたクラスは、そのままnew User()できますか。- 抽象クラスに共通処理を書くと、子クラスではどのように使えますか。
public abstract String getRoleName();のような抽象メソッドは、子クラスで何をする必要がありますか。
演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。
あわせて読みたい関連記事
- Javaの継承とは?親クラスの機能を子クラスで引き継ぐ考え方
- Javaのオーバーライドとは?親クラスのメソッドを子クラスで上書きする考え方
- Javaのsuperとは?親クラスのコンストラクタやメソッドを呼び出す書き方
まとめ
Javaの抽象クラスは、継承して使うことを前提にした親クラスです。共通処理を親クラスにまとめながら、子クラスで必ず作る処理を抽象メソッドとして決められます。抽象クラスそのものは new できないため、具体的な子クラスを作って利用します。