参照型の配列は、基本的には基本型の配列と同様に記述していきます。
あらかじめ設定した 3個の点を表示するプログラムを製作することにします。仕様を以下に定めます。
この仕様を満たすソースコードは以下の通り。
J301/J301.java
import java.awt.Point; /** * 参照型の一次配列を使用します。 */ public class J301 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // Point[]型インスタンスの生成と、参照型変数の宣言、紐付け Point[] points = new Point[3]; // Point型インスタンスの生成 points[0] = new Point(10, 15); points[1] = new Point(100, 50); points[2] = new Point(20, 30); for(int i = 0; i < points.length; i ++) { System.out.println((i + 1) + "番目は " + points[i]); } } }
実行結果の例は以下の通り(実行環境によって出力結果が異なることがあります)。
1番目は java.awt.Point[x=10,y=15] 2番目は java.awt.Point[x=100,y=50] 3番目は java.awt.Point[x=20,y=30]
以下の点に注意して下さい。
new Point[3]
の記述によって、Point[]型インスタンスが生成されるが、Point型インスタンスまでが生成される訳ではない。Point[]型インスタンスの各要素(インスタンスフィールド)は、nullで初期化される。したがって、Point型インスタンスの生成前に使用しようとすると、例外NullPointerExceptionが発生する。.toString()
が省略されています。イメージとしては以下のような感じです。String型インスタンスについては記述を省略しています。
配列の参照型の宣言と配列インスタンスの生成・初期化を一括で行う場合、簡易的に記述できます。
ソースコードは以下の通り。
J302/J302.java
import java.awt.Point; /** * 参照型の一次配列を使用します(初期化します)。 */ public class J302 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // Point[]型インスタンスと Point型インスタンスの生成 // 参照型変数の宣言、紐付け Point[] points = { new Point(10, 15), new Point(100, 50), new Point(20, 30), }; for(int i = 0; i < points.length; i ++) { System.out.println((i + 1) + "番目は " + points[i]); } } }
実行結果は以下の通り。
1番目は java.awt.Point[x=10,y=15] 2番目は java.awt.Point[x=100,y=50] 3番目は java.awt.Point[x=20,y=30]
これは「new Point[]
が省略されている」とみなすこともできます。予約語new
が使用されていない場合においても、配列インスタンスが生成されていることに変わりないことに注意してください。
イメージとしては以下のような感じです。String型インスタンスについては記述を省略しています。
以下の二次配列を表示するプログラムを記述します。
1列 | 2列 | 3列 | |
---|---|---|---|
1行目 | (10, 15) | (100, 50) | (20, 30) |
2行目 | (40, 20) | (80, 10) | (75, 45) |
この仕様を満たすソースコードは以下の通り。
J303/J303.java
import java.awt.Point; /** * 参照型の二次配列を使用します。 */ public class J303 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // Point[][]型インスタンスと Point型[]インスタンス、Point型インスタンスの生成 // 参照型変数の宣言、紐付け Point[][] points = { { new Point(10, 15), new Point(100, 50), new Point(20, 30), }, { new Point(40, 20), new Point(80, 10), new Point(75, 45), }, }; for(int j = 0; j < points.length; j ++) { System.out.println((j + 1) + "行目"); for(int i = 0; i < points[j].length; i ++) { System.out.println(" " + (i + 1) + "列目は " + points[j][i]); } } } }
実行結果の例は以下の通り(実行環境によって出力結果が異なることがあります)。
1行目 1列目は java.awt.Point[x=10,y=15] 2列目は java.awt.Point[x=100,y=50] 3列目は java.awt.Point[x=20,y=30] 2行目 1列目は java.awt.Point[x=40,y=20] 2列目は java.awt.Point[x=80,y=10] 3列目は java.awt.Point[x=75,y=45]
予約語 newは 6回使用されていますが、実際はそれ以外にも、Point[][]型配列インスタンスが 1個、Point[]型配列インスタンスが 2個生成されていることに注意してください。
イメージとしては以下のような感じです。String型インスタンスについては記述を省略しています。
多次元配列についても、基本的には、基本型の配列と同様の記述ができます。
繰り返しになりますが、初期値を指定しない場合の初期化の際には、一次の配列インスタンスの初期値としてnullが設定されることに留意してください。