Javaの抽象クラスとは?基本ルールと実装例をわかりやすく解説
Javaの抽象クラスとは
宣言に「abstract」キーワードを含むクラスは、抽象クラスと呼ばれます。抽象クラスは、継承によって利用されることを前提とした設計用のクラスであり、オブジェクト指向プログラミングにおける重要な概念の一つです。
抽象クラスの主な特徴
- 抽象クラスには、抽象メソッド(本体を持たないメソッド。例:
public void get();)が含まれる場合もあれば、含まれない場合もあります。 - ただし、クラス内に1つでも抽象メソッドが存在する場合、そのクラスは必ず
abstractとして宣言しなければなりません。 abstractとして宣言されたクラスは、インスタンス化(newによるオブジェクト生成)ができません。- 抽象クラスを使用するには、別のクラスから継承し、その中で抽象メソッドの実装を提供する必要があります。
- 抽象クラスを継承した場合、その中のすべての抽象メソッドに対して実装を提供しなければなりません。
抽象クラスの作成例
ここでは、抽象クラスの具体的な例を紹介します。抽象クラスを作成するには、クラス宣言時に class キーワードの前に abstract キーワードを付けるだけです。
/* ファイル名 : Employee.java */
public abstract class Employee {
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public double computePay() {
System.out.println("Inside Employee computePay");
return 0.0;
}
public void mailCheck() {
System.out.println("Mailing a check to " + this.name + " " + this.address);
}
public String toString() {
return name + " " + address + " " + number;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public void setAddress(String newAddress) {
address = newAddress;
}
public int getNumber() {
return number;
}
}ご覧のとおり、Employeeクラスは抽象メソッドを除けば、通常のJavaクラスとほぼ同じ構造です。このクラスは abstract として宣言されていますが、それでも3つのフィールド、7つのメソッド、そして1つのコンストラクタを持っています。
抽象クラスはインスタンス化できない
それでは、次のようにEmployeeクラスを直接インスタンス化しようとすると、どうなるのでしょうか。
/* ファイル名 : AbstractDemo.java */
public class AbstractDemo {
public static void main(String [] args) {
/* 以下のコードは許可されず、エラーが発生します */
Employee e = new Employee("George W.", "Houston, TX", 43);
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}上記のクラスをコンパイルすると、次のようなエラーが出力されます。
Employee.java:46: Employee is abstract; cannot be instantiated
Employee e = new Employee("George W.", "Houston, TX", 43);
^
1 errorこのエラーは、「Employeeは抽象クラスであるため、インスタンス化できない」という意味です。抽象クラスを実際に利用するには、Employeeクラスを継承した具象クラス(concrete class)を作成し、必要に応じて抽象メソッドを実装したうえで、その子クラスのインスタンスを生成します。この仕組みにより、共通の設計を強制しながら、柔軟なクラス階層を構築することができます。
-
Javaのsuperキーワードとは?使い方とサンプルコードを徹底解説
JavaのsuperキーワードとはJavaにおけるsuperキーワードは、サブクラスから直接の親クラス(スーパークラス)のメンバーやコンストラクタへアクセスするために使われる重要なキーワードです。主な役割は以下の3つです。親クラスのインスタンス参照:super変数は、直近の親クラスのインスタンスを参照します。親クラスのメソッド呼び出し:superを使うことで、オーバーライドされた親クラスのメソッドを呼び出せます。親クラスのコンストラクタ呼び出し:super()は親クラスのコンストラクタとして機能し、子クラスのコンストラクタ内では必ず最初の行に記述する必要があります。特に、オーバーライドされたメ
-
Javaの集約(Aggregation)とは?HAS-A関係の基本をわかりやすく解説
Javaにおける集約(Aggregation)とは、オブジェクト指向プログラミングにおける「HAS-A関係」を表す概念です。あるクラスが、別のクラスのオブジェクトを「持っている(has-a)」という関係性を指します。まずは具体的な例を見てみましょう。集約のコード例public class Vehicle{} public class Speed{} public class Van extends Vehicle { private Speed sp; }この例では、VanクラスがSpeedクラスのインスタンスをフィールドとして保持しています。つまり、「VanはSpeedを持っている(