次のように、3件入力後に、3件表示するプログラムを検討します(赤が入力)
商品コード>>D05 数量>>50 商品コード>>B10 数量>>90 商品コード>>C01 数量>>45 1番目レコード 商品コード:D05 数量:50 2番目レコード 商品コード:B10 数量:90 3番目レコード 商品コード:C01 数量:45
このプログラムに、対応するためRecord2.javaに次のinitメソッドを追加します。
import java.util.Scanner; //Scannerクラスをinitで使うため追加
public class Record2{
public String sho; // 商品コード
public short suu; // 数量
//n番目表示としてオペレータ用で画面表示する
public void display(int n){
System.out.printf("%4d番目レコード\n", n);
System.out.printf("\t商品コード:%s\n", sho);
System.out.printf("\t数量:%d\n", suu);
}
//商品コードと数量を引数で設定するメソッド
public void init(String shoCode, int n) {
sho = shoCode;
suu = (short)n;
}
//引数ありコンストラクタ
public Record2(String sho, int n){
init(sho, n);
}
//引数なしコンストラクタ
public Record2(){
}
//商品コードと数量をキー入力
public void init(Scanner stdin) {
System.out.print(" 商品コード>>");
sho = stdin.nextLine();
System.out.print(" 数量>>");
String s = stdin.nextLine();
suu = (short)Integer.parseInt(s);
}
}
上記では、Stringとintを引数にしているinitメソッドがすでに存在していますが、
それと同じ名前のinit(Scanner stdin){ 〜を作っています。
このように引数の種類や数が異なれば、同じ名前のメソッドでも作ることができ、
これはオーバーロード(多重定義) と呼ばれます。
(『この例では、Scannerを引数とするinitメソッドをオーバーロードした』ということになります。)
これで、利用する場合の実引数の指定方法によって、自動的に対応するメソッドが実行します。
例えば Record2のオブジェクトoが用意される時、次のように使えます。
o.init("A01", 10); // initメソッドが実行します。
Scanner stdin = new Scanner(System.in);
o.init( stdin ); // initメソッドが実行します。
新しくオーバーロードで作成したinitメソッドでは、
キー入力が可能なScannerのオブジェクトを引数にして、
その入力で各フィールド(sho, suu)の設定をしています。
よって、このinitメソッドを次のように使えば、上記実行例のプログラムは次のように作ることができます。
public class Test { public static java.util.Scanner stdin = new java.util.Scanner(System.in); public static void main(String[] arg) { Record2 []a = new Record2[3]; a[0] = new Record2(); // Record2オブジェクト生成(コンストラクタ実行) a[0].init(stdin); // キー入力 a[1] = new Record2(); // Record2オブジェクト生成(コンストラクタ実行) a[1].init(stdin); // キー入力 a[2] = new Record2(); // Record2オブジェクト生成(コンストラクタ実行) a[2].init(stdin); // キー入力 for (int i = 0; i < a.length; i++) { a[i].display(i+1); } } }
Record2.javaにScannerを引数にした次のコンストラクタを追加します。
(クラスの中で、フィールドやメソッド、コンストラクタを並べる順番は自由です。)
//キー入力データで初期化するコンストラクタ public Record2(Scanner stdin){ init(stdin); }
このオーバーロードしたコンストラクタ追加により、new Record2( Scannerオブジェクト )の
表現で、キー入力が行われ、それで初期化されたRecord2オブジェクトが生成できるようになります。
これで、上記プログラムは次のように簡単になります。
public class Test { public static java.util.Scanner stdin = new java.util.Scanner(System.in); public static void main(String[] arg) { Record2 []a = new Record2[3]; a[0] = new Record2(stdin); // キー入力でRecord2オブジェクト生成(コンストラクタ実行) a[1] = new Record2(stdin); // キー入力でRecord2オブジェクト生成(コンストラクタ実行) a[2] = new Record2(stdin); // キー入力でRecord2オブジェクト生成(コンストラクタ実行) for (int i = 0; i < a.length; i++) { a[i].display(i+1); } } }