QA@IT

Javaの配列でnew演算子を省略できるのはなぜですか

817 PV

javaの配列はなぜ「newなし」で使えてしまうのか?

配列の宣言+実体化の手順は以下と認識しています

   型名[] 変数名 = new 型名[要素数];

が、実際には以下のように
初期化を同時に行う際にはnewが省略されるパターンもあるかと思います。

   int score[] = {70, 64, 80, 91, 87};

「Javaが裏でうま~くやってるんだよ」

そう言われたらそれまでなのですが・・・

int score[]; で実体化済みなのでしょうか?

参照型の中でも配列だけは特別扱いされているんでしょうか?

回答

一ヶ月前なのでもう見てないかもしれませんが、「Javaが裏でうま~くやってるんだよ」がざっくりすぎるだろと気になったので。

{70, 64, 80, 91, 87}というのは言語仕様で定められた、Array Initializerと言うものです。

日本語のドキュメントが見つけられなかったので、英語版の仕様貼っておきますが、日本語だと配列初期化子ですかね。
https://docs.oracle.com/javase/specs/jls/se6/html/arrays.html#11358

{70, 64, 80, 91, 87} によって、要素5個のintの配列を作るコードが自動作成され、それがscore変数に代入されます。調べてませんがどのようなコードが自動作成されるかは実装依存(コンパイラ任せ)だと思います。

言語仕様にはこういったコードを書くことが便利になるものもあり(初学者には覚えることが増えて大変になるかもしれませんが)、シンタックスシュガー(糖衣構文)と呼ばれます。

編集 履歴 (0)
  • 〉flied_onionさま
    ご回答ありがとうございました。{}はInitializerだったのですね!
    大変勉強になりました。シンタックスシュガーに振り回されながら
    これからもJava勉強していきたいと思います。
    本当にありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。