配列の初期化のコードトレース
配列の初期化では、長さを指定して既定値の要素を作る方法と、初期化子で各要素の値を列挙する方法を使い分けます。宣言時・再代入時の構文、各型の初期値、生成時の例外まで確認します。
この単元で学ぶこと
- 配列生成と初期化子の構文を判定する
- 要素型ごとの既定値を求める
- 初期化子の評価順と例外を追う
本文解説
宣言記法の違い int[] a,b;はaもbも配列変数です。int a[],b;ではaだけが配列でbはintです。角括弧を型の側に置くか変数の側に置くかで複数宣言の読み方が変わります。読みやすいint[] aの形式を基本にします。
末尾カンマ int[] a={2,4,};の末尾カンマは許可され、長さは2です。空の要素が追加されるわけではありません。一方{2,,4}のような途中の空項目は不正です。改行で要素を列挙するときの末尾カンマと区別します。
定数の縮小代入 byte[] a={1,127};は定数が範囲内なので合法です。{128}は範囲外です。int n=1;byte[] a={n};では通常のint変数を暗黙縮小できません。final int n=1の定数変数なら範囲内の定数式として扱えます。
参照要素の生成 String[] a=new String[2];は二つのnull参照を持ちます。a[0]="x"としてもa[1]はnullです。要素ごとに明示的な値を設定する必要があり、配列の生成と要素オブジェクトの生成は別です。
二つの配列を別々に作る int[] a=new int[2],b=new int[2];は同じ長さの別実体です。a[0]=3でもb[0]は0です。int[] b=aの場合との違いはnewを何回実行したかにあります。初期値が等しいことは参照が等しいことを意味しません。
長さに使った変数の更新 int n=2;int[] a=new int[n];n=5;としてもa.lengthは2です。生成時点の値で長さが確定し、nへ連動して伸縮しません。違う長さが必要なら新しい配列を生成して参照を付け替えます。
初期化中の例外 int z=0;int[] a={1,10/z,3};では二番目の式の評価でArithmeticExceptionとなり、後続の項目を評価しません。変数aへの代入も完了しません。初期化子全体がコンパイルできても、実行時に失敗する場合があります。
初期化子が使う参照 int[] a={1,2};int[] b={a[0],a[1]};は値を読み取って別配列を作ります。その後a[0]=9としてもb[0]は1です。配列変数の参照を代入する操作と、要素値を読み出して新しい配列の初期値へ使う操作は異なります。
図解
重要ポイント
- new int[3]は三要素を0で初期化する。
- 参照型配列の各要素は既定でnull。
- 宣言時は{...}を使えるが再代入ではnew 型[]{...}とする。
- 長さ指定と値の列挙を同時には書かない。
間違えやすい点
- String配列を作ればString実体も作られると思わない。
- 空配列の生成とnull参照を混同しない。
- 負の長さをコンパイルエラーだと決めつけない。
用語解説
- 配列初期化子
- {2,4,6}のように要素値を順に並べる構文。
- 既定値
- 明示的な要素値を指定しない生成時に入る型ごとの値。
- 配列生成式
- new int[3]やnew int[]{2,4}のように配列実体を作る式。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。