コンストラクタ
この記事は私のJavaの学習なメモです。
Javaのコンストラクタ、getter、setterについて学んだ内容を書いています。
コンストラクタとは
コンストラクタ は、インスタンスを生成するタイミングで呼び出される、 特別なメソッドです。
普通のメソッドと似ていますが、**名前には「クラス名と同じ名前」**をつかい、戻り値がないので戻り値の型を指定しないところが違います。
コンストラクタは 引数 を持ことができ、呼び出されたコンストラクタ内では、それを用いた処理などさまざまなことを行うことができます。
通常はコンストラクタ内で、フィールド変数などに 初期化処理 を記述 することが多いです。
また、クラスを使用する際に 習慣化したい処理がある場合 などにも利用します。
コンストラクタの記述のしかた
コンストラクタの記述は、こちらのような順序で行います。
- アクセス修飾子(省略可)
- コンストラクタ名
- 丸括弧内に引数の型
- 引数名
アクセス修飾子 コンストラクタ名(引数の型 引数名) {
//処理
}
以下のコードは ポケモンのデータをを扱うようなクラス のコンストラクタの例です。
//① ② ③ ④
public Pokemon(String name){
//処理
}
コード内の順で記述し、 ブロック( { } )で囲むようにして 実際の処理を記述します。
コンストラクタ名に関しては、クラス、フィールド変数でも触れましたが、コンストラクタはクラスと同じ名前を付ける決まりになっています。
コンストラクタ使用例
引数なしの場合
//ConstructorPractice.java(引数なし)
public class ConstructorPractice {
String str = "引数なしの場合こちらの表示がでます。";
// コンストラクタ
public ConstructorPractice() {
System.out.println(str);
}
}
//Main.java(引数なし)
public class Main {
public static void main(String[] args) {
// インスタンスの生成
ConstructorPractice cp = new ConstructorPractice();
}
}
実行結果
引数なしの場合こちらの表示がでます。
引数ありの場合
ConstructorPractice.java
//引数ありの場合
public class ConstructorPractice {
String str = "引数ありの場合";
// コンストラクタ
public ConstructorPractice(String str) {
System.out.println(str);
}
}
Main.java
public class Main {
public static void main(String[] args) {
//インスタンスの生成
ConstructorPractice cp = new ConstructorPractice("引数ありの場合こちらの表示がでます。");
}
}
実行結果
引数ありの場合こちらの表示がでます。
コンストラクタ ありの場合の値のセット方法
また、通常のメソッドと異なり、 コンストラクタには戻り値がありません。
クラスに コンストラクタ を実装することで、
そのクラス内に存在するフィールド変数への値の設定を一括で行うことができるため、
インスタンス生成後は持つべき情報が詰まったクラスが使用可能となります。
先ほど作成したクラスには、例えば以下のような情報を持つとします。
- ボケモンナンバー
- ぶんるい
- 名前
- タイプ
- 説明文
仮にこれらの情報が すべて必須であるならば、
いちいちインスタンスを生成してからセットするのではなく、
以下のようにして インスタンス生成時に一括で値をセットする 方が賢い書き方になります。
ここまではインスタンスを生成してから、フィールドの値をセットしてきましたが、これはインスタンスフィールドが増えると面倒になりそうです。
実はインスタンスフィールドへの値のセットを楽にする方法が用意されています。
※ ちなみに中に入っている [this] という値は**「ローカル変数とフィールド変数を明確に区別するため、フィールド変数名の頭につける特殊な変数」**です。this は クラス内のメソッドの定義の中でのみ使用できます。
コンストラクタ がある時の値のセット
Pokemonクラス
//【Pokemon.java】
public class Pokemon {
// フィールド変数
public int number;
public String name;
public String category;
public String type;
public String description;
public Pokemon(int number, String name, String category, String type, String description) {
this.number = number;
this.name = name;
this.category = category;
this.type = type;
this.description = description;
}
}
Main.java
//【Main.java】
public class Main {
public static void main(String[] args) {
// 呼び出し(new した後で、引数へ与えられた値を元に Pokemon が生成されます)
Pokemon pikachu = new Pokemon(025, "ピカチュウ", "ねずみポケモン", "でんき",
"つくる でんきが きょうりょくな ピカチュウほど ほっぺの ふくろは やわらかく よく のびるぞ");
// 使用時
System.out.print("No." + pikachu.number);
System.out.println(" " + pikachu.name);
System.out.print(pikachu.category);
System.out.println(" " + pikachu.type + "タイプ");
System.out.println(pikachu.description);
}
}
実行結果
No.21 ピカチュウ
ねずみポケモン でんきタイプ
つくる でんきが きょうりょくな ピカチュウほど ほっぺの ふくろは やわらかく よく のびるぞ
コンストラクタ なしの時の値のセット
//【Main.java】
public class Main {
public static void main(String[] args) {
// 呼び出し(new した後で、引数へ与えられた値を元に Pokemon が生成されます)
Pokemon mewtwo = new Pokemon();
// set〇〇で値をセットする
mewtwo.setNumber(150);
mewtwo.setName("ミュウツー");
mewtwo.setCategory("いでんしポケモン");
mewtwo.setType("エスパー");
mewtwo.setDescription("研究のために遺伝子をどんどん組み換えていった結果 凶暴なポケモンになった。");
// get〇〇で値を取得する
System.out.println("No." + mewtwo.getNumber());
System.out.println(mewtwo.getName());
System.out.println(mewtwo.getCategory());
System.out.println(mewtwo.getType() + "タイプ");
System.out.println(mewtwo.getDescription());
}
}
//【Pokemon.java】
public class Pokemon {
// フィールド変数
private int number;// ポケモンのナンバー
private String name;// ポケモンの名前
private String category;// ポケモンの分類
private String type;// ポケモンのタイプ
private String description;// ポケモンの説明
// setter
public void setNumber(int number) {
this.number = number;
}
public void setName(String name) {
this.name = name;
}
public void setCategory(String category) {
this.category = category;
}
public void setType(String type) {
this.type = type;
}
public void setDescription(String description) {
this.description = description;
}
// Getter
public int getNumber() {
return this.number;
}
public String getName() {
return this.name;
}
public String getCategory() {
return this.category;
}
public String getType() {
return this.type;
}
public String getDescription() {
return this.description;
}
}
実行結果
No.150
なまえ ミュウツー
いでんしポケモン
エスパータイプ
研究のために遺伝子をどんどん組み換えていった結果 凶暴なポケモンになった。
カプセル化に必要な getter 及び setter の理解が全然出来ていなかったので実装に時間かかった。。