Javaコンストラクタをマスター:種類、使い方、実践例
Javaコンストラクタ
このチュートリアルでは、Javaコンストラクタの種類と使い方を例を用いて学びます。
コンストラクタとは?
Javaのコンストラクタは、クラスのオブジェクトが作成されたときに呼び出されるメソッドに似ています。
Javaメソッドとは異なり、コンストラクタはクラスと同じ名前を持ち、戻り値の型を持ちません。例えば、
class Test {
Test() {
// コンストラクタ本体
}
}
ここでは、Test()がコンストラクタです。クラスと同じ名前で、戻り値の型がありません。
推奨リーディング: なぜコンストラクタは値を返さないのか
例1: Javaコンストラクタ
class Main {
private String name;
// コンストラクタ
Main() {
System.out.println("コンストラクタが呼び出されました:");
name = "Programiz";
}
public static void main(String[] args) {
// Mainクラスのオブジェクト作成時に
// コンストラクタが呼び出される
Main obj = new Main();
System.out.println("名前は " + obj.name);
}
}
出力:
コンストラクタが呼び出されました: 名前は Programiz
上記の例では、Main()というコンストラクタを作成しました。コンストラクタ内でname変数の値を初期化しています。
Mainクラスのオブジェクト作成文に注目してください。
Main obj = new Main();
ここでは、オブジェクトが作成されるとMain()コンストラクタが呼び出され、name変数の値が初期化されます。
したがって、プログラムはname変数の値をProgramizとして出力します。
コンストラクタの種類
Javaではコンストラクタを3種類に分類できます:
- 引数なしコンストラクタ
- パラメータ付きコンストラクタ
- デフォルトコンストラクタ
1. Java引数なしコンストラクタ
メソッドと同様に、Javaコンストラクタはパラメータ(引数)を持つ場合と持たない場合があります。
コンストラクタがパラメータを受け取らない場合、引数なしコンストラクタと呼ばれます。例えば、
private Constructor() {
// コンストラクタ本体
}
例2: Java private引数なしコンストラクタ
class Main {
int i;
// パラメータなしコンストラクタ
private Main() {
i = 5;
System.out.println("コンストラクタが呼び出されました");
}
public static void main(String[] args) {
// パラメータなしでコンストラクタ呼び出し
Main obj = new Main();
System.out.println("iの値: " + obj.i);
}
}
出力:
コンストラクタが呼び出されました iの値: 5
上記の例では、Main()というコンストラクタを作成しました。ここではコンストラクタがパラメータを受け取らないため、引数なしコンストラクタと呼ばれます。
コンストラクタがprivateで宣言されていることに注意してください。
コンストラクタがprivateで宣言されると、クラス外部からアクセスできなくなります。そのため、プライベートコンストラクタを使用してクラス外部からオブジェクトを作成することは禁止されます。
ここでは同じクラス内でオブジェクトを作成しているため、プログラムはコンストラクタにアクセスできます。詳細については、Javaプライベートコンストラクタの実装を参照してください。
しかし、クラス外部でオブジェクトを作成したい場合は、コンストラクタをpublicで宣言する必要があります。
例3: Java public引数なしコンストラクタ
class Company {
String name;
// publicコンストラクタ
public Company() {
name = "Programiz";
}
}
class Main {
public static void main(String[] args) {
// 別のクラスでオブジェクト作成
Company obj = new Company();
System.out.println("会社名 = " + obj.name);
}
}
出力:
会社名 = Programiz
推奨リーディング: Javaアクセス修飾子
2. Javaパラメータ付きコンストラクタ
Javaコンストラクタは1つ以上のパラメータを受け取ることもできます。このようなコンストラクタはパラメータ付きコンストラクタ(引数ありコンストラクタ)と呼ばれます。
例4: パラメータ付きコンストラクタ
class Main {
String languages;
// 単一値を受け取るコンストラクタ
Main(String lang) {
languages = lang;
System.out.println(languages + " プログラミング言語");
}
public static void main(String[] args) {
// 単一値を渡してコンストラクタ呼び出し
Main obj1 = new Main("Java");
Main obj2 = new Main("Python");
Main obj3 = new Main("C");
}
}
出力:
Java プログラミング言語 Python プログラミング言語 C プログラミング言語
上記の例では、Main()というコンストラクタを作成しました。ここではコンストラクタが単一のパラメータを取ります。式、
Main obj1 = new Main("Java");
に注目してください。ここではコンストラクタに単一の値を渡しています。渡された引数に基づいて、コンストラクタ内でlanguage変数が初期化されます。
3. Javaデフォルトコンストラクタ
コンストラクタを作成しない場合、Javaコンパイラはプログラム実行時に自動的に引数なしコンストラクタを作成します。このコンストラクタをデフォルトコンストラクタと呼びます。
例5: デフォルトコンストラクタ
class Main {
int a;
boolean b;
public static void main(String[] args) {
// デフォルトコンストラクタが呼ばれる
Main obj = new Main();
System.out.println("デフォルト値:");
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
出力:
a = 0 b = false
ここではコンストラクタを作成していません。したがって、Javaコンパイラが自動的にデフォルトコンストラクタを作成します。
デフォルトコンストラクタは、未初期化のインスタンス変数をデフォルト値で初期化します。
| 型 | デフォルト値 |
|---|---|
boolean | false |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
char | \u0000 |
float | 0.0f |
double | 0.0d |
object | 参照 null |
上記のプログラムでは、変数aとbがデフォルト値0とfalseでそれぞれ初期化されます。
上記のプログラムは以下と等価です:
class Main {
int a;
boolean b;
// privateコンストラクタ
private Main() {
a = 0;
b = false;
}
public static void main(String[] args) {
// コンストラクタ呼び出し
Main obj = new Main();
System.out.println("デフォルト値:");
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
このプログラムの出力は例5と同じです。
Javaコンストラクタの重要な注意点
- コンストラクタはオブジェクトをインスタンス化するときに暗黙的に呼び出されます。
- コンストラクタ作成の2つのルール:
コンストラクタ名はクラス名と同じであること
Javaコンストラクタは戻り値の型を持たないこと - クラスにコンストラクタがない場合、Javaコンパイラは実行時に自動的にデフォルトコンストラクタを作成します。デフォルトコンストラクタはインスタンス変数をデフォルト値で初期化します。例:
int変数は0で初期化 - コンストラクタの種類:
引数なしコンストラクタ - 引数を受け取らないコンストラクタ
パラメータ付きコンストラクタ - 引数を受け取るコンストラクタ
デフォルトコンストラクタ - 明示的に定義されていない場合にJavaコンパイラが自動作成 - コンストラクタは
abstract、static、finalにできません。 - コンストラクタはオーバーロード可能ですが、オーバーライドはできません。
Javaコンストラクタのオーバーロード
Javaメソッドのオーバーロードと同様に、異なるパラメータを持つ2つ以上のコンストラクタを作成できます。これをコンストラクタオーバーロードと呼びます。
例6: Javaコンストラクタオーバーロード
class Main {
String language;
// パラメータなしコンストラクタ
Main() {
this.language = "Java";
}
// 単一パラメータコンストラクタ
Main(String language) {
this.language = language;
}
public void getName() {
System.out.println("プログラミング言語: " + this.language);
}
public static void main(String[] args) {
// パラメータなしコンストラクタ呼び出し
Main obj1 = new Main();
// 単一パラメータコンストラクタ呼び出し
Main obj2 = new Main("Python");
obj1.getName();
obj2.getName();
}
}
出力:
プログラミング言語: Java プログラミング言語: Python
上記の例では、2つのコンストラクタMain()とMain(String language)があります。両方ともlanguage変数の値を異なる値で初期化します。
オブジェクト作成時に渡されるパラメータに基づいて、異なるコンストラクタが呼び出され、異なる値が割り当てられます。
あるコンストラクタから別のコンストラクタを呼び出すことも可能です。詳細については、Javaで1つのコンストラクタから別のコンストラクタを呼び出すを参照してください。
注意: クラスの変数を指定するためにthisキーワードを使用しました。thisキーワードについては、Java thisキーワードを参照してください。
Java
- C++コンストラクタ完全ガイド:デフォルト、パラメータ付き、コピーの違いと実例
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Javaコンストラクタをマスター:種類、使い方、実践例
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaのthisキーワード徹底解説:実践的な用法とコンストラクタ活用
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Java Enumコンストラクタ徹底解説:実践例で理解する
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法