第9章 クラスライブラリについて

9.5 クラス型(オブジェクト)の配列について

クラスも型の1つであることを本章では学習してきました。型の1つであるならばJava入門で学んだ基本データ型のように、クラスも配列として扱うことができるのです。
例えば、基本データ型であるint型の値を格納する配列は以下のように記述してきました。

1int[] score = new int[3];
2 
3score[0] = 75;
4score[1] = 49;
5score[2] = 86;

クラス型の配列を扱う場合でも、型が基本データ型(int、doubleなど)からクラス型(String、ユーザー定義クラス)に変わるだけで宣言方法は同じになります。
では以下にクラス型配列の基本構文を示します。

書式:クラス型の配列


または

この2つの宣言方法は基本データ型の配列と同じです

凡例:クラス型の配列

配列の宣言方法は基本データ型でもクラス型でも「[]」をつけ、要素数を指定して配列要素を確保するのは変わりません。但しクラス型の配列は宣言しただけでは中身は「null」になっている為、値を参照する場合は注意が必要です。

ポイント
  • クラス型も基本データ型のように配列として扱うことができる。

では次項でクラス型の配列を利用したプログラムを紹介します。

9.5.1 クラス型の配列を利用したプログラム

クラス型の配列を利用して複数のオブジェクトを、まとめて扱えることを確認します。クラス型の配列を使ったプログラムについて学習しましょう。

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: Computer1

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: ClassArray
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

ソースコード

Computer1.java
※9.3.1で作成したComputer1クラスを利用します。

ClassArray.java

1package jp.co.f1.basic.ch09;
2 
3public class ClassArray {
4  public static void main(String[] args) {
5    //クラス型配列を宣言
6    Computer1[] coms = new Computer1[3];
7 
8    //繰り返しを利用して配列要素にオブジェクトを代入
9    for(int i=0;i<coms.length;i++){
10      coms[i] = new Computer1();
11    }
12 
13    //各配列要素のオブジェクトからメソッドを呼び出す
14    coms[0].setComputer("WindowsXP", 1024);
15    coms[1].setComputer("WindowsVista", 2048);
16    coms[2].setComputer("Windows7", 3072);
17 
18    //繰り返しを利用して各オブジェクトの情報を表示する
19    for(int i=0;i<coms.length;i++){
20      coms[i].show();
21    }
22  }
23}
実行結果

解説

6行目でComputer1クラスの配列を宣言と同時に要素の数分(3つ)だけ領域を確保しています。

1//クラス型配列を宣言
2Computer1[] coms = new Computer1[3];


図 9.5.1:クラス型配列宣言

9~11行目で配列要素の数分だけ繰り返し処理を行い、各配列要素にComputer1オブジェクトを代入しています。クラス型でも基本データ型と同じように「配列変数名.length」を利用して、配列の要素数が取得できます。今回の場合だと「3」が取得できます。繰り返し処理内でnewされているのでcoms[0]~coms[2]に入っているオブジェクトは別々のオブジェクトになります。

1for(int i=0;i<coms.length;i++){
2  coms[i] = new Computer1();
3}

繰り返し処理内では、以下のような代入処理が行われています。


図 9.5.2:クラス型配列へオブジェクト代入

14~16行目で配列の各要素に代入されている「オブジェクト場所情報」を元に「setComputerメソッド」を呼び出して値の設定を行っています。オブジェクトの場所情報が入っているのが配列の各要素の変数に変わっても、各メンバへのアクセス方法は「.」を使うのはこれまでと同じになります。

1coms[0].setComputer("WindowsXP", 1024);
2coms[1].setComputer("WindowsVista", 2048);
3coms[2].setComputer("Windows7", 3072);


図 9.5.3: クラス型配列へオブジェクト代入

19~21行目でも繰り返し処理を配列の要素数分だけ行い、各オブジェクトの「showメソッド」を呼び出してパソコンの情報を呼び出しています。

1for(int i=0;i<coms.length;i++){
2  coms[i].show();
3}

繰り返し処理内部では以下のような処理が行われています。


図 9.5.4:クラス型配列へオブジェクトからインスタンスメソッドへアクセス

実行結果からも分かるように配列要素の数分(3つ)だけ、パソコンオブジェクトが作成され配列に格納されています。配列変数の各要素からもオブジェクトにアクセスできていることが正しく確認できます。

クラス型配列を扱う場合は2つの作業が必要です。

  • クラス型の配列を用意する。
  • オブジェクトを作成して、配列変数の要素に代入する。

どちらもnew演算子を使って行いますので、間違えないよう注意して下さい。

NEXT>> 9.6 ArrayListクラスについて

f