前回クラスの定義とフィールド変数を宣言するところまで見ました。今回はクラスにメソッドを定義します。メソッドはフィールド変数を外部に参照させたりフィールド変数の値を変更させたりするために使います。メソッドmethodは「手段」「手法」という意味です。日本語ではメトードなどとも書かれて学習方法の名前に使われていることがあります。
初期化の問題
雛形である銀行口座クラスから実例であるインスタンスを作成する処理、3つのフィールドに初期の値を設定している箇所は以下のように4回の操作になっていました。
BankAccount my_account = new BankAccount(); my_account.account_number = "01234567"; my_account.account_name = "口座太郎"; my_account.amount = 1000;
インスタンスを作成するにはnewの後にクラス名を書けばよいのでした。その後フィールド値に値を設定しています。しかしインスタンスの設定だけでフィールド値の設定を忘れてしまうとどうなるのでしょうか?
以下はフィールド値の設定を行わずに口座の情報を出力した例です。
BankAccount my_account = new BankAccount(); System.out.println( "口座番号" + my_account.account_number + " 名義人" + my_account.account_name + "の口座の残高は " + my_account.amount + "円です。");
実行すると以下のように出力されます。
口座番号null 名義人nullの口座の残高は 0円です。
致命的とはいえないのですが情報がないままはあまりよいとは言えません。
コンストラクタを定義する
そこで初期設定用のメソッドを定義します。初期設定用のメソッドをコンストラクタと言います。constructorは「建設業者」の意味ですがJavaでは「インスタンスを作成するメソッド」という意味で使われます。
コンストラクタには引数を持たせることができます。ここに初期化に必要な3つのフィールド変数を設定できるようにします。
BankAccount(String account_number, String account_name, int amount){ this.account_number = account_number; this.account_name = account_name; this.amount = amount; }
メソッドは通常戻り値の型とメソッド名が必要なのですがコンストラクタは特別でクラス名の後に( )で引数の指定を行います。その後{ }の中に処理を記述します。
引数にaccount_numberという文字列の変数を定義していますがフィールド変数にも同じ名前の変数があります。この場合{ }の中の処理では引数に指定された変数が優先されます。つまりaccount_numberだけだとフィールド値は参照できません。
フィールド値を参照するには明示的にthisというキーワードを指定します。その後にピリオドをつけて変数名を指定することにより現在作成しているインスタンスのフィールド変数を指定できます。
初期化処理の修正
このようにコンストラクタを定義すると今まで使っていたデフォルトのコンストラクタは使えなくなります。つまり
new BankAccount();
はもう使えないのです。コンパイル時にエラーになります。代わりに
new BankAccount("0123456", "口座太郎", 1000);
というように初期化に必要な情報を指定しないとインスタンスが作れないようになります。初期設定の値を指定して実行すると以下のように情報が欠落することなく出力することができます。
口座番号0123456 名義人口座太郎の口座の残高は 1000円です。
最後にソースコードを載せておきます。
class BankAccount { String account_number; String account_name; int amount; BankAccount(String account_number, String account_name, int amount){ this.account_number = account_number; this.account_name = account_name; this.amount = amount; } public static void main(String[] args){ BankAccount my_account = new BankAccount("0123456", "口座太郎", 1000); System.out.println( "口座番号" + my_account.account_number + " 名義人" + my_account.account_name + "の口座の残高は " + my_account.amount + "円です。"); } }