18.
コンストラクタ
コンストラクタとは
コンストラクタのメリット
コンストラクタ(constructor)は、インスタンス生成時に自動実行されるメソッドです。コンストラクタがないと、インスタンス生成の時点で、フィールド値が初期状態のままになってしまいます。そこでコンストラクタを使うと引数にフィールドに値を設定したり、共通処理を実行できます。
- データ設定を必須にする
- 必ず処理が実行される
コンストラクタの定義
コンストラクタはクラス内に、クラス名のメソッドを定義します。引数は定義できますが、戻り値は定義できません。
修飾子 クラス名 (型 引数) {
//インスタンス生成時の処理
}
コンストラクタの実行
インスタンス生成でコンストラクタが実行
コンストラクタはインスタンス生成、つまりクラスを「new」した時点で自動実行されます。
//クラスを「new」すると実行
new クラス名();
引数指定もできる
コンストラクタに引数がある場合は、引数指定もできます。
//引数を使ってインスタンスを生成
new クラス名(引数, ...);
コンストラクタの実装
コンストラクタを定義し、実行してみましょう。コンストラクタは手動でコーディングしてもよいですが、Eclipseの自動入力機能を使うと便利です。
コンストラクタの自動入力
Character.javaを選択します。

「ソース」メニューから「スーパークラスからコンストラクタを生成...」を選択します。
そのまま【生成】ボタンをクリックします。
Character.javaにコンストラクタが自動挿入されました。
Character.java
public class Character {
...
//コンストラクタ
public Character(String name, String job) {
super();
System.out.println("キャラクタ新規作成");
this.name = name;
this.job = job;
this.hp = 50;
}
...
}
スーパークラスとは
クラスには「継承」という仕様があり、クラスを親子関係とした階層構造にすることができます。スーパークラスは、クラス階層で上位のクラスで、Javaでの最上位のクラス(トップレベルクラス)はObjectクラスです。
super()メソッド
コンストラクタに入力された super()は、スーパークラスのコンストラクタを実行するメソッドです。上位クラス(サブクラス)の指定がない場合は、Objectクラスのコンストラクタが実行されます。
super();
コンストラクタの確認
コンストラクタの自動実行を確認するために、メッセージをコンソール表示しておきます。
Character.java
public Character() {
super();
System.out.println("キャラクタ新規作成");
}
コンストラクタの確認
「App.java」を実行して、コンストラクタを確認しましょう。Characterインスタンスを生成すると、コンストラクタが自動実行されているのがわかります。
実行結果
キャラクタ新規作成
rpg.Character@xxxxxx
...
アリス move left
キャラクタ新規作成
ボブ!勝負しましょう!
...
コンストラクタ(引数)
コンストラクタの変更
「name」「job」を引数としたコンストラクタに変更し、フィールド値を設定します。「hp」は引数に関わらず「50」としておきます。
Character.java
public class Character {
...
//コンストラクタ
public Character(String name, String job) {
super();
System.out.println("キャラクタ新規作成");
this.name = name;
this.job = job;
this.hp = 50;
}
...
}
メインメソッドの修正
引数のコンパイルエラー
コンストラクタを修正すると、引数がマッチしていないのでコンパイルエラーになりました。

引数と設定値の修正
「wizard」「warrior」インスタンスに「name」「job」の引数を指定して、フィールドの設定値を削除してみましょう。
App.java
package rpg;
public class App {
public static void main(String[] args) {
Character wizard = new Character("アリス", "wizard");
System.out.println(wizard.name);
System.out.println(wizard.job);
System.out.println(wizard.hp);
wizard.walk("left");
Character warrior = new Character("ボブ", "warrior");
wizard.talk(warrior, "勝負しましょう!");
System.out.println(warrior.hp);
wizard.attack(warrior);
System.out.println(warrior.hp);
}
}
結果
「name」「job」「hp」がコンストラクタで実行した値になりました。
キャラクタ新規作成
アリス
wizard
50
アリス move left
キャラクタ新規作成
ボブ!勝負しましょう!
50
49
初期化ブロック
初期化ブロックは、インスタンス生成より前で処理したい時に、{ } のメソッドで定義できます。
初期化ブロックの例
Characterクラスに「level」フィールドと初期化ブロックを追加し、「level」フィールドの値を「1」で初期化します。
package rpg;
public class Character {
public String name;
public String job;
public int hp;
public int level;
//初期化ブロック
{
System.out.println("初期化ブロック");
level = 1;
}
...
}
メインメソッドで「leve」のコンソール表示を追加して、確認してみましょう。
App.java
package rpg;
public class App {
public static void main(String[] args) {
Character wizard = new Character("アリス", "wizard");
System.out.println(wizard.name);
System.out.println(wizard.job);
System.out.println(wizard.hp);
System.out.println(wizard.level);
...
}
}
結果
コンストラクタが実行される前に、初期化ブロックが実行されました。「level」の値も初期化されています。
初期化ブロック
キャラクタ新規作成
アリス
wizard
50
1
アリス move left
初期化ブロック
キャラクタ新規作成
ボブ!勝負しましょう!
50
49
演習
つぎのプログラムがあります。
Animal.java
package zoo;
public class Animal {
public String type;
public String name;
public String crying;
public Animal(String type, String name, String crying) {
super();
this.type = type;
this.name = name;
this.crying = crying;
}
public void walk() {
String message = this.name + "が歩いた";
System.out.println(message);
}
public void cry() {
System.out.println(this.crying);
}
public void escape() {
String message = this.name + "が逃げた";
System.out.println(message);
}
}
AnimalApp.java
package zoo;
public class AnimalApp {
public static void main(String[] args) {
Animal dog = new Animal("dog", "ポチ", "わん!");
Animal cat = new Animal("cat", "ミケ", "にゃー!");
Animal elephant = new Animal("elephant", "ジャンボ", "ぱおーん!");
dog.cry();
cat.escape();
elephant.cry();
dog.escape();
}
}
問題1
Animal.java の Animal(String type, String name, String crying) 部分のことを何といいますか?
1)クラス
2)インスタンス
3)インスタンスメソッド
4)コンストラクタ
問題2
「AnimalApp.java」を実行した結果はどれですか?
1)にゃー! ミケが逃げた ぱおーん! ポチが逃げた
2)にゃー! ミケが逃げた わん! ポチが逃げた
3)わん! ミケが逃げた ぱおーん! ジャンボが逃げた
4)わん! ミケが逃げた ぱおーん! ポチが逃げた