Javaの言語学習中にコンストラクタとメソッドがこんがらがってしまったため、それぞれの違いをまとめてみました。
具体的には以下のようなシーンで勘違いをしました。
列挙型の学習をしていた際に、コンストラクタと書かれたDayOfWeekをメソッドと勘違いしました。
public class Main {
public static final int SUNDAY = 0;
public static final int MONDAY = 1;
enum DayOfWeek {
SUNDAY,
MONDAY;
//コンストラクタ
DayOfWeek() {
System.out.println("c");
}
}
public static void main(String... args) {
printDayOfWeek(DayOfWeek.SUNDAY);
}
static void printDayOfWeek(DayOfWeek dayOfWeek) {
if (dayOfWeek == DayOfWeek.SUNDAY) {
System.out.println("日");
} else if (dayOfWeek == DayOfWeek.MONDAY) {
System.out.println("月");
}
}
}
違い
名前:
コンストラクタは、そのクラスの名前と同じにしなければなりません。
メソッドは、自由に名前をつけることができます。
宣言:
コンストラクタは返り値の型を持ちませんし、返り値の型を記述しません(voidも含む)。
メソッドは常に返り値の型を記述します。返り値がない場合にはvoidを使います。
役割と実行タイミング:
コンストラクタは、クラスのオブジェクト(インスタンス)が作成されるときに一度だけ呼ばれ、オブジェクトを初期化します。
メソッドは、オブジェクトが作成された後に何度でも呼び出すことができ、特定の操作や機能を提供します。
呼び出し方:
コンストラクタは、newキーワードとともに呼び出され、新しいオブジェクトの生成時にだけ実行されます。
メソッドは、既存のオブジェクトに対して呼び出すことができ、自分で明示的に呼び出すことが必要です。
日常生活を例に確認
では最後に、日常的に使う車を例に考えてみます。
Carクラスを使って、コンストラクタとメソッドの違いを確認してみましょう。
public class Car {
String color;
// コンストラクタ
public Car(String color) {
this.color = color; // オブジェクトの色を設定する
}
// メソッド
public void drive() {
System.out.println("Driving " + this.color + " car!");
}
}
結局、それぞれ何ができるの?
コンストラクタ : フィールドの初期化
コンストラクタであるCar(String color)
は新しいCarオブジェクトを作成する際に呼ばれ、colorフィールドを初期化します。
(例)
Car myCar = new Car("Red"); // コンストラクタが呼ばれている
Car型のmyCarという変数オブジェクトを定義したいときに、コンストラクタを使ってmyCarの初期値をRedとして定義することができます。
メソッド : 動きのある処理
メソッドdrive()
は作成されたCarオブジェクトに対して呼び出され、その色の車が運転されていることを出力することができます。
(例)
myCar.drive(); // メソッドが呼ばれている
前述で定義した変数オブジェクトCarをdriveメソッドに使い、「Driving Red car!」と出力できます。
まとめ
コンストラクタは特別なメソッドのようなもので、オブジェクトの初期化に特化しています。
メソッドはその後の動作を定義し、必要に応じて何度も使うことができます。