• ベストアンサー

変数の初期値

へんてこな質問かもしれません・・・ class Syokika{   public static void main(String args[]){     int[] a = new int[1];     System.out.println(a[0]);   } } を実行するとどうなるかという問題なのですが、 「変数が初期化されていない」 というエラーが出ると思っていたのですが、 答えは「0と表示される」でした・・・ で、解説を見ると、「配列が生成されるときに初期値が生成される。intの場合は0だ」と書いてありました。 でも、たんにint a;とした場合にaを参照しようとすると初期化されてないですよね・・・? これはどういうことなのでしょうか・・・?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

こんばんは。 今日私も丁度勉強したところだったんで、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で初期化されています。 以上、拙いながらも私も今日初めて知ったことをカキコさせていただきました<(_ _)>

azicyan
質問者

補足

・メンバ変数は自動的に初期化される ・ローカル変数は自動的に初期化されない ・ローカル宣言される配列は初期化される アーこれわかりやすいですね!! こういってもらえると通りがいいです! ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • kakuto
  • ベストアンサー率25% (1/4)
回答No.5

オブジェクトや配列のインスタンスを生成したときは、そのインスタンスの内容は全て 0(boolean の場合は false、オブジェクトの場合は null)で初期化されます。

azicyan
質問者

補足

やっとわかりました!

全文を見る
すると、全ての回答が全文表示されます。
  • kkbb
  • ベストアンサー率0% (0/1)
回答No.3

int a; int[] a; この2つはエラーが出ます。初期化されてません。 int a = 0; int[] a = new int[1]; この2つはエラーが出ません。初期化されてます。 int[] a = new int[1];(初期化されてる) int a;(初期化されてない) 初期化してる物としてない物を比較されてます。

azicyan
質問者

補足

ありがとうございました。 例のぶんコンパイルして見ます

全文を見る
すると、全ての回答が全文表示されます。
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

実は、普通の変数、配列とでは、初期化の必要性が異なるのです。 普通の変数は、コンパイルの時点で確実に代入されているかいないか判断できますが、配列はそうは行きません。 普通の変数は、変数の利用可能範囲(スコープ)がそのメソッド内に限られるので、代入の有無の判別は容易です。 しかし、配列の場合、配列を作成したメソッド内でその配列の利用が終わるとは限りません。例えばメソッドの戻り値として渡されたりフィールドに代入されたりして、他のメソッドでも利用されるということが考えられます。 このように利用可能な範囲が広い配列は、コンパイル時に代入の有無をいちいち確実に判断できません。例えば、呼び出し先メソッドから返された配列の要素がすべて代入されているかどうかということを、呼び出し元メソッド側から知る方法があるでしょうか? 配列の要素に値が代入されているかどうかを調べるのは、コンパイル時はおろか実行時でも困難です。 そこで、配列の要素は、配列を作成した時点で自動的に初期化されるようになっています。そうすれば、要素が代入されているかどうか(コンパイル時でも実行時でも)いちいち気にしなくてすみます。 ただし、普通のローカル変数は、コンパイル時に代入の有無がチェックされます。ローカル変数の宣言時に自動的に初期化すること大して意味がないこと、および、変数の代入忘れによるバグを防止することが主な理由です。 なお、各インスタンスのフィールドの値も、インスタンスを生成した時点で自動的に初期化されます。 (抽象的でちょっと分かりづらい回答になってしまったかな)

azicyan
質問者

補足

>実は、普通の変数、配列とでは、初期化の必要性が異なるのです。 なるほど。 とりあえず、配列のときは初期化されるとおぼえて置けばよいでしょうか? >なお、各インスタンスのフィールドの値も、インスタンスを生成した時点で自動的に初期化されます。 これも確かに不思議でした。 ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。
  • kiyohu16
  • ベストアンサー率38% (8/21)
回答No.1

int[] a = new int[1]; のnew int[1]というところで、int型の配列[1]の領域を新たに取得し、そのときint型で0に初期化するというものだったような気がします。そして、aはその領域を指す(C言語のポインタのような感じ)という意味だったような気がします。 文献が今手元にないので、断定ができないのですが、 このことは、 内田智史著:「Javaプログラミング徹底入門 応用編」(電波新聞社) で配列を詳しく書いている部分がありますので、よろしければ参考にしてください。 (参考URLは著者の研究室のWebページです)

参考URL:
http://www.inf.ie.kanagawa-u.ac.jp/
azicyan
質問者

補足

ありがとうございます。 NEW がみそのようですね!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • javaのローカル変数について

    基本的なことの質問ですがよろしくお願いいたします。 下記の様なソースコードでint y ;はローカル変数にあたると思いますが 確かローカル変数は初期化されないとコンパイルエラーになるはずなのですが どうもコンパイルも実行もできます。 どうしてでしょうか? よろしくお願いいたします。 class Test1{ static int x = 0; } public class Test extends Test1{ public static void main(String args[]){ Test i = new Test(); int y ; y = ++x; System.out.println( y ) ; } }

    • ベストアンサー
    • Java
  • 文字列のメンバ変数を外部変数のように扱いたい

    済みません。質問なのですが、 メンバ変数を外部変数のように扱うにはどうしたらよいのでしょうか? int型などの場合、 class test{ static const int a; }; const int test::a = 10; とすればよいですよね? これをcharの配列にして class test{ static char a[7][32]; }; char test::a[0] = "test"; とすると サイズが0の配列を割り当てまたは宣言しようとしました というコンパイルエラーがでてしまいます…。 多次元配列の場合はstatic変数としてもてないのでしょうか? char** として宣言してもどこでnewを行えばよいか解りません。 コンストラクタの中で行えば そこでstaticではなくなってしまいますし…。 後、できればstringクラスの配列で持ちたいのですが #include <string> class test{ static string test[7]; }; string test::test[0] = "aaa"; なんてことができますでしょうか? 質問内容が解りにくいかも知れませんが どうか教えてください。 宜しくお願いいたします。

  • 参照・値渡しについて

    下記プログラム(ソース1)を実行すると「1」という値が出力されます。しかし、2行目をprivate static int a;とすると「0」という値が出力されます。 オブジェクトは参照渡しで基本データ型は値渡しと思ったのですが、2行目の値をString型で行ったところ全く変更されていない値が出力されました。(ソース2) 一体どういうことでしょうか? 回答のほどよろしくお願い致します。 (ソース1) public class X{ private static int a[] = new int[1]; public static void main(String []args){ modify(a); System.out.println(a[0]); } public static void modify(int a[]){ a[0]++; } } (ソース2) public class X{ static String a = "a"; public static void main(String []args){ modify(a); System.out.println(a); } public static void modify(String a){ a = "b"; } }

    • ベストアンサー
    • Java
  • Java main関数内でStatic変数使えない

    JavaのStatic変数について質問です。 Main関数の中でStaticな変数を定義しようとしたところ、 final修飾子しか使えませんというエラー文言が出ます。 Main関数内でわざわざStatic変数を使用する必要はないのですが、 出来ないと言われると何故だろうと思ってしまいます。 どなたかご説明いただけないでしょうか? -------------------------------------------------------------------- class Test { public static void main(String[] args) { // 宣言時Staticは使えなく、finalでしか定義できないとエラーが出る Static int test_val = 10; // 表示 System.out.println(test_val); } }

    • ベストアンサー
    • Java
  • forループの中での初期化

    http://www.okweb.ne.jp/kotaeru.php3?q=802781 すいません。またわからなくなってしまいました。 class Fooo{   public static void main(String args[]){     int a;     int b=10;     int c;     for(int i=0;i<5;i++){       a=10;       c=b+i;       System.out.print(c);     }     System.out.println(a);   } } 初期化は「確実に」行われていますよね? aが初期化されてない、というコンパイルエラーが出るのです・・・ なぜですか???

    • ベストアンサー
    • Java
  • JAVAのマルチスレッドの共有変数についての質問

    JAVAのマルチスレッドの共有変数についての質問です。 スレッドを2つ作ってその2つのスレッド共有の配列を作りたいのですがどうすれば良いのでしょうか。 コードは以下のとおりです。 public class testes extends Thread { int n; int a[]={10,10}; public testes(int n){ this.n = n; } public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ testes t1 = new testes(0); testes t2 = new testes(1); t1.start(); t2.start(); } public void run(){ a[n] =n; System.out.println(a[0]+","+a[1]); } } 実行すると(0,10)もしくは(10,1)が表示されます。 このとき(0,1)と表示するにはどうすれば良いのでしょうか。

  • Javaプログラミングについて

    ・下記のプログラミングで「//ここで配列を昇順にソートする」というプログラムがわかりません!! わかる方がいましたらサンプルを教えてください。 public class SortNum { public static void main(String[] args){ int[] a={5,9,3,1,7,8,2,6,4}; //数列の初期化 //ここで配列を昇順にソートする //ソートされた配列を出力 for(int i = 0;i < a.length;i++){ System.out.println(a[i]); } } }

  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • 質問です。

    コンパイルはできるのですが、実行するとExption in thread"main"java.lang ArrayIndex0ut0fBoundsExcept ion :0 at java1_1.main(java1_1.java:19と表示をされてしまってできません。教えてください。宜しくお願いします。 /* 実行時引数を受け取り乱数を設定 */ class java1-1 { public static void array_syokika(int a[]) { for(int i = 0; i < a.length; i++) { a[i] = (int)(100 * Math.random()); } } public static void main(String args[]) { int num = Integer.parseInt(args[0]); int a[] = new int[num]; array_syokika(a); for(int i = 0; i < a.length; i++) { System.out.println("a[" + i + "]=" + a[i]); } } }

    • ベストアンサー
    • Java
  • javaのインスタンス変数とクラス変数の意味がわからない。

    かなり初心者です。全然意味がわかりません。教えてください。よろしくおねがいします。 この意味すべてわからないです。 public class TestCount{ static int counterA; int counterB; public static void main(String []args){ TestCount testA=new TestCount(); TestCount testB=new TestCount(); testA.count(); testB.count(); } public void count(){ for(int i=0;i<5;i++){ counterA++; counterB++; } System.out.println("counterA="+counterA); System.out.println("counterB="+counterB); } } 実行結果 counterA=5 counterA=5 counterB=10 counterB=5 なんでこうなるのかが知りたいです。

    • ベストアンサー
    • Java