- ベストアンサー
変数の初期値
へんてこな質問かもしれません・・・ class Syokika{ public static void main(String args[]){ int[] a = new int[1]; System.out.println(a[0]); } } を実行するとどうなるかという問題なのですが、 「変数が初期化されていない」 というエラーが出ると思っていたのですが、 答えは「0と表示される」でした・・・ で、解説を見ると、「配列が生成されるときに初期値が生成される。intの場合は0だ」と書いてありました。 でも、たんにint a;とした場合にaを参照しようとすると初期化されてないですよね・・・? これはどういうことなのでしょうか・・・?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 今日私も丁度勉強したところだったんで、azicyanさんが求めている回答になっているかどうかわかりませんが、書き込みさせていただきます。 手元の参考書を見ると、 ・メンバ変数は自動的に初期化される ・ローカル変数は自動的に初期化されない ・ローカル宣言される配列は初期化される ってことを踏まえて、下記のソースを実行すると、 class Main{ int y; public static void main(String args[]){ Main obj = new Main(); System.out.println("y =" +obj.y); } } 実行結果→y=0 int yはメンバ変数なので、自動的に0で初期化されています。 以上、拙いながらも私も今日初めて知ったことをカキコさせていただきました<(_ _)>
その他の回答 (4)
- kakuto
- ベストアンサー率25% (1/4)
オブジェクトや配列のインスタンスを生成したときは、そのインスタンスの内容は全て 0(boolean の場合は false、オブジェクトの場合は null)で初期化されます。
補足
やっとわかりました!
- kkbb
- ベストアンサー率0% (0/1)
int a; int[] a; この2つはエラーが出ます。初期化されてません。 int a = 0; int[] a = new int[1]; この2つはエラーが出ません。初期化されてます。 int[] a = new int[1];(初期化されてる) int a;(初期化されてない) 初期化してる物としてない物を比較されてます。
補足
ありがとうございました。 例のぶんコンパイルして見ます
- UKY
- ベストアンサー率50% (604/1207)
実は、普通の変数、配列とでは、初期化の必要性が異なるのです。 普通の変数は、コンパイルの時点で確実に代入されているかいないか判断できますが、配列はそうは行きません。 普通の変数は、変数の利用可能範囲(スコープ)がそのメソッド内に限られるので、代入の有無の判別は容易です。 しかし、配列の場合、配列を作成したメソッド内でその配列の利用が終わるとは限りません。例えばメソッドの戻り値として渡されたりフィールドに代入されたりして、他のメソッドでも利用されるということが考えられます。 このように利用可能な範囲が広い配列は、コンパイル時に代入の有無をいちいち確実に判断できません。例えば、呼び出し先メソッドから返された配列の要素がすべて代入されているかどうかということを、呼び出し元メソッド側から知る方法があるでしょうか? 配列の要素に値が代入されているかどうかを調べるのは、コンパイル時はおろか実行時でも困難です。 そこで、配列の要素は、配列を作成した時点で自動的に初期化されるようになっています。そうすれば、要素が代入されているかどうか(コンパイル時でも実行時でも)いちいち気にしなくてすみます。 ただし、普通のローカル変数は、コンパイル時に代入の有無がチェックされます。ローカル変数の宣言時に自動的に初期化すること大して意味がないこと、および、変数の代入忘れによるバグを防止することが主な理由です。 なお、各インスタンスのフィールドの値も、インスタンスを生成した時点で自動的に初期化されます。 (抽象的でちょっと分かりづらい回答になってしまったかな)
補足
>実は、普通の変数、配列とでは、初期化の必要性が異なるのです。 なるほど。 とりあえず、配列のときは初期化されるとおぼえて置けばよいでしょうか? >なお、各インスタンスのフィールドの値も、インスタンスを生成した時点で自動的に初期化されます。 これも確かに不思議でした。 ありがとうございました
- kiyohu16
- ベストアンサー率38% (8/21)
int[] a = new int[1]; のnew int[1]というところで、int型の配列[1]の領域を新たに取得し、そのときint型で0に初期化するというものだったような気がします。そして、aはその領域を指す(C言語のポインタのような感じ)という意味だったような気がします。 文献が今手元にないので、断定ができないのですが、 このことは、 内田智史著:「Javaプログラミング徹底入門 応用編」(電波新聞社) で配列を詳しく書いている部分がありますので、よろしければ参考にしてください。 (参考URLは著者の研究室のWebページです)
補足
ありがとうございます。 NEW がみそのようですね!
補足
・メンバ変数は自動的に初期化される ・ローカル変数は自動的に初期化されない ・ローカル宣言される配列は初期化される アーこれわかりやすいですね!! こういってもらえると通りがいいです! ありがとうございました!