Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ コンストラクタ | クラス
Javaクラスとコアメカニクス

bookコンストラクタ

メニューを表示するにはスワイプしてください

クラス初期化の簡素化方法

毎回各フィールドを初期化するのは手間がかかる場合があります。そのために、クラスにはコンストラクタがあります。コンストラクタの構文は以下の通りです:

Main.java

Main.java

copy
1234
modifier ClassName(ParameterType parameter1, ParameterType parameter2) { this.parameter1 = parameter1; this.parameter2 = parameter2; }

ここで記載されている各用語について説明します:

  • modifier: アクセス修飾子を指し、コンストラクタでは多くの場合publicが使われます。異なるアクセス修飾子を持つコンストラクタについては、別のコースで扱います。
  • ClassName: このコンストラクタを作成するクラスの名前です。
  • ParameterType: コンストラクタで使用されるパラメータの型です。ここは重要で、このパラメータはクラス内のフィールドと同じ型である必要があります。 例えば: クラスにString nameint ageという2つのパラメータがある場合、コンストラクタも同じパラメータを持つ必要があります(すべてのフィールドをコンストラクタで初期化したい場合)。特定のクラスフィールドのみをコンストラクタで初期化したい場合、例えばnameのみの場合は、クラス内のフィールドと同じ型・名前のパラメータを1つだけ使用します。
  • 次に、コンストラクタ本体内で、パラメータで渡された値を使ってクラスフィールドに値を代入します。

"this" キーワード

this キーワードを使用することで、そのキーワードが記述されているクラスフィールドを参照可能。例えば、クラスに nameage という2つのフィールドがある場合、コンストラクタメソッド内で this.name と記述すると、ローカル変数ではなくクラスフィールドを明示的に参照できる。この方法により、コンストラクタ内で this.name = name; のような構文でクラスフィールドを初期化可能。

すべてのフィールドを初期化するためのクラス内コンストラクタの例を以下に示す。

Person.java

Person.java

copy
1234567891011
class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } }

Person というクラスには3つのフィールドが存在し、それぞれのフィールドが this キーワードを用いてコンストラクタに追加されている。そのため、コンストラクタはパラメータから受け取った値でフィールドを初期化する。このコンストラクタを main メソッドで利用し、パラメータとして渡した値でフィールドが初期化されることを確認する。

Main.java

Main.java

copy
123456789101112131415161718192021
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); } }

コンストラクタを使用して Person オブジェクト bob を初期化し、nameagegenderパラメータとして渡しました。その後、これらのパラメータを画面に出力し、オブジェクトのフィールド値がコンストラクタのパラメータで指定された通りであることを確認します。

コンストラクタのオーバーロード

コンストラクタはオーバーロードすることもでき、すべてのクラスフィールドの初期化をカバーしない場合もあります。例えば、Alice の gender を指定したくない場合、2つのパラメータのみを受け取るコンストラクタをオーバーロードし、それらでフィールドを初期化することができます。

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); } }

コンストラクタはメソッドと同様にオーバーロードでき、異なる数や型のパラメータを受け取ることが可能。

デフォルトコンストラクタ

デフォルトコンストラクタは、パラメータを受け取らずフィールドを初期化しないコンストラクタ。クラスに他の種類のコンストラクタが存在しない場合、すべてのクラスにデフォルトで存在するため、デフォルトコンストラクタと呼ばれる。任意のクラスのオブジェクトを作成するたびに、コンストラクタが使用される。パラメータを受け取るコンストラクタがすでに存在する場合にデフォルトコンストラクタを利用したい場合は、空のコンストラクタも記述する必要がある。

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); Person john = new Person(); System.out.println("John's name: " + john.name + ", John's age: " + john.age); } }

3種類の異なるコンストラクタを使用して、それぞれのPersonオブジェクトを初期化している。最後の例でわかるように、John名前も年齢も持たない。これは、これらのフィールドがオブジェクトに対して初期化されていないため。このように、必要なだけコンストラクタをオーバーロードし、それを通じてオブジェクトを作成できる。

1. 次のうち、コンストラクタに関する正しい記述はどれですか?

2. Javaにおけるコンストラクタの目的は何ですか?

3. 次のうち、パラメータ付きコンストラクタを正しく作成しているコードスニペットはどれですか?

question mark

次のうち、コンストラクタに関する正しい記述はどれですか?

すべての正しい答えを選択

question mark

Javaにおけるコンストラクタの目的は何ですか?

正しい答えを選んでください

question mark

次のうち、パラメータ付きコンストラクタを正しく作成しているコードスニペットはどれですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  6

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 4.  6
some-alt