
インスタンス変数を初期化する場合は、「コンストラクタ」を使うのが一般的です。
コンストラクタの動作タイミングとしては、「インスタンスが生成されるのと同タイミング」になります。
コンストラクタの構文
1 2 3 4 5 |
public class クラス名(){ クラス名(){ ★ここに、初期化したい値を記述していく。 } } |
コンストラクタの構文を見ればわかりますが、「引数」や「戻り値」は定義しないです。
実装例
コンストラクタを使う前のプログラム
1 2 3 4 5 6 7 8 9 10 |
public class People { String name = "太郎"; //名前 int weight = 60; //体重 void weightAsk() { System.out.println("私の体重は" + this.weight + "kgです。"); } } |
コンストラクタ適用後のプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class People { String name; //名前 int weight; //体重 //コンストラクタ People(){ this.name = "太郎"; //名前 this.weight = 60; //体重 } void weightAsk() { System.out.println("私の体重は" + this.weight + "kgです。"); } } |
ただ、上記の例であれば、別にコンストラクタを使うメリットはないですよね。
コンストラクタのメリットとしては、下記のように引数を渡すコンストラクタを使用する場合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class People { String name; //名前 int weight; //体重 //コンストラクタ People(String name,int weight){ this.name = name; //名前 this.weight = weight; //体重 } void weightAsk() { System.out.println("私の体重は" + this.weight + "kgです。"); } } |
上記、プログラムを下記のように呼んであげれば、インスタンス生成時に、Peopleクラスの値を個々の値に書き換えることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Main { public static void main(String args[]) { People taro = new People("太郎",60); taro.weightAsk(); People hanako = new People("花子",40); hanako.weightAsk(); } } |
実行結果
引数なしのコンストラクタも、引数ありと同時に宣言できる。
また、もちろん、引数なしのコンストラクタも同時に宣言できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class People { String name; //名前 int weight; //体重 //コンストラクタ(引数なし) People(){ this.name = "テスト"; //名前 this.weight = 100; //体重 } //コンストラクタ(引数あり) People(String name,int weight){ this.name = name; //名前 this.weight = weight; //体重 } void weightAsk() { System.out.println("私の体重は" + this.weight + "kgです。"); } } |
このメリットとしては、毎回newする際に、引数を与えると、テストが大変だったりするので、なくても生成できます。
thisとは?
また、上記処理だとコンストラクタの処理が一部重複してしまっています。その場合は「this」を使うことですっきり書くことができます。
thisとは「自分自身のインスタンス」のこと。
フィールドにアクセスする場合
例えば、下記のように、「ローカル変数」や「メソッドの引数」と名前がかぶっていたとしても、「インスタンスの変数」を使うことができます。
もし、「インスタンスの変数」を使う場合は、明示的に「this」をつけるようにしましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package opp; public class People { String name; //名前 int weight = 60; //体重 void weightAsk() { int weight = 50; //ローカル変数 System.out.println("私の体重は" + this.weight + "kgです。"); } } |
別コンストラクタを呼び出す場合
下記のように記述すれば、別コンストラクタを呼び出すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class People { String name; //名前 int weight; //体重 //コンストラクタ(引数なし) People(){ this("テスト",100); } //コンストラクタ(引数あり) People(String name,int weight){ this.name = name; //名前 this.weight = weight; //体重 } void weightAsk() { System.out.println("私の体重は" + this.weight + "kgです。"); } } |
thisを使うことで、「引数なしのコンストラクタ」と「引数ありのコンストラクタ」で、初期化処理が重複しないようにできます。
まとめ
コンストラクタのメリットとしては、主に「個々のインスタンスごとに、動的に初期化することができる点」です。
クラスから、個々のインスタンスを作成する場合は、個々のインスタンスごとに、値が異なるのが当たり前ですからね。
この記事へのコメントはありません。