私はJavaを学び始めていますが、配列の宣言では、このようにサイズを指定できないことがわかりました(Cで使用されています)。
int a[10];
しかし、私たちはこのようにする必要があります:
int[] a=new int[10];
int a[]=new int[10];
Cスタイルのような配列宣言を許可するのではなく、Javaがここで複雑に見えるのはなぜですか?
JavaはCではないためです。JavaはCといくつかの共通のイディオムを共有していますが(実際にはかなりの数です)、Java言語の開発者はC言語の取り組みに完全に注目していませんでした。
配列自体はヒープに格納されているオブジェクトであるため、配列を作成するにはaを実行する必要がありnew
ます。配列への参照 a[]
はスタックに格納される可能性がありますが、それは配列自体ではありません。
Java 配列はオブジェクトです。Java はこれらのベアボーン配列をオブジェクト内にラップするため、オブジェクトのすべてのメソッドを配列で呼び出すことができます。
**int a[]** = new int[5];
5
角括弧内は、5 つの値を格納することを示しており、配列 'n' のサイズです。
インスタンス化: newキーワードは、オブジェクトを作成する Java オペレーターです。また、Java配列はオブジェクトであるため、必要です。
初期化: new 演算子の後には、新しいオブジェクトを初期化するコンストラクターへの呼び出しが続きます。
注意。
Javaでは、メモリは常に動的に割り当てられ(オブジェクトは新しい演算子によって動的にメモリが割り当てられます)、その後「忘れられます」(言語は実際にそれらを忘れさせます)。つまり、コーダーは、メモリ割り当ての混乱をクリーンアップするためにガベージ コレクション エンジンに任せます。C では、静的メモリ割り当ての概念により、次の宣言が可能です。
int a[10];
これは、より大きな全体像の一部です: Java にはスタック割り当て構造はありません。型システムをプリミティブ型と参照型に分割できるのはそのためです。後者のインスタンスは、参照を介して動的に割り当てられ、アクセスされます。これは、Java 設計の深い不変条件です。
この理由は、Java の設計を推進する主要な目標にまでたどり着くことができます。それは、適切な表現力を提供しながら、できるだけ落とし穴の少ない単純な言語にすることです。
スタックに割り当てられた配列の何がそんなに複雑なのかと疑問に思うかもしれません。問題は、それを別の関数に渡そうとしたときに始まります。値による受け渡しは問題外であり、参照による受け渡しは、スタック割り当てオブジェクトへの参照がメソッドのスコープをエスケープすることを意味するため、割り当て解除後に逆参照される可能性があります。