次のように、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);
}
}
}