- ベストアンサー
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_ja
- お礼率50% (2/4)
- Java
- 回答数4
- ありがとう数3
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>この意味すべてわからないです。 順を追って説明して見ましょう。 public class TestCount{ //クラスTestCout定義 static int counterA; //static変数counterAの定義 int counterB; //普通の変数counterB定義 public static void main(String []args){ TestCount testA=new TestCount(); //インスタンスtestAの生成 TestCount型の変数testAの定義とメモリ領域の確保 TestCount testB=new TestCount(); //インスタンスtestBの生成 TestCount型の変数testBの定義とメモリ領域の確保 testA.count(); //testAのメソッドcount()の呼出し testB.count(); //testBのメソッドcount()の呼出し } public void count(){ //メソッドcount()の定義 for(int i=0;i<5;i++){ counterA++; //counterA=cunterA+1 counterB++; //counterB=cunterB+1 } System.out.println("counterA="+counterA); System.out.println("counterB="+counterB); } }
その他の回答 (3)
- fortranxp
- ベストアンサー率26% (181/684)
本当はこうなるはず。 counterA=5 counterB=5 counterA=10 counterB=5 結果を見てえっ。と 思ってしまいました。 理由はBLUEPIXYさんが述べられているとおり counterAはstatic変数なのでどこかで初期化 されない限り値が保持されるためです。
- javatea_1985
- ベストアンサー率0% (0/2)
ごめんなさい、横槍を入れさせてください。。 えと、 public void count(){ for(int i=0;i<5;i++){ counterA++; counterB++; } の部分は testA.count(); testB.count(); } によって2回転しますよね? それならcounterAとcounterBの合計は20になるはずではないのですか?? ところが実行結果は合計25になっています。。 これはどうしてなのですか? あと、counterAとcounterBの表示が交互にこないのはなぜなのですか?? 質問者の解答を差し置いての発言、失礼しました。m(__)m
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
クラス変数counterA は、クラスに共通な変数で1つしかありません。 インスタンス変数counterB は、インスタンス毎作られます。 なので、testA と testB のcounterB は、それぞれ別のものですが、 counterA は、testA と testB で共通の同じものです。 なので、counterB は、5回カウントアップされるので、5になり、 counterA は、testA testB で5回ずつカウントアップされるので、10になります。
お礼
よくわかりました。ありがとうございました。
関連するQ&A
- 実行の順番を教えてください。
現在JAVAの学習をおこなっていて、参考書で勉強しています。 しかし、以下の3つのソースコードはどの順番で実行されているか理解できておりません。 すみませんが、実行の順番を教えて頂けないでしょうか。 実行の順に数字を振ったりしていただけますと特に嬉しいです。 お願いします。 ※サンプル1 class testA{ testB b; testA(){ b=new testB(this); } } class testB{ testA a; testB(testA a){ this.a=a; } } class testAll{ public static void main(String args[]){ new testAll().banana(); //ソースコード } void banana(){ testA test = new testA(); } } ※サンプル2 public class A{ public static void apple(Integer i){ int ta =i.intValue(); ta+=3 ; i=new Integer(ta); } public static void main(String args[]){ Integer i = new Integer (0); apple(i); System.out.println(i.intValue()); } } ※サンプル3 public class Test{ public static void main (String args[]){ class orange{ public int i =9; } Object o=(Object)new orange(); orange orange = (orange)o; System.out.println("i="+orange.i); } }
- ベストアンサー
- Java
- java iを1づつ増やすプログラムと2づつ増やすプログラム
次のようにすればiを1づつ増やして表示されます。 class Calc{ int i=1; int add(){ return i++; } } class Count{ public static void main(String[] args){ Calc calc = new Calc(); System.out.println("i = " + calc.add()); System.out.println("i = " + calc.add()); System.out.println("i = " + calc.add()); } } 実行結果 i = 1 i = 2 i = 3 しかし次のように2づつ増やそうとすると、 class Calc{ int i=1; int add(){ return i+2; } } class Count{ public static void main(String[] args){ Calc calc = new Calc(); System.out.println("i = " + calc.add()); System.out.println("i = " + calc.add()); System.out.println("i = " + calc.add()); } } 実行結果 i = 3 i = 3 i = 3 このようになってしまいます。どこがおかしいのでしょうか?
- ベストアンサー
- Java
- 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
- 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
- javaのプログラムについて
java始めたばかりの者です。 class sample1 { public static void main(String[] args) { for(int i=1; i<=5; i++){ for(int j=0; j<i; j++){ System.out.println("*"); } System.out.println("\n"); } } } これを実行すると * * * * * * * * * * * * * * * こうなってしまい * ** *** **** ***** このようにするにはどうしたらいいのでしょうか??
- ベストアンサー
- Java
- javaのカウントアップについて
javaのEclipseを使っています。 カウントアップ後、表示する度に、 1, 2, 3, …と表示するプログラムを作りたいです。 プログラム例を教えて下さい。 public class Test { public static void main(String[] args) { Count count = new Count(); int scount = count.read(); count.write(scount); } } class Count { int count = 1; int read() { return count++; } void write(int scount) { System.out.println(scount); } }
- 締切済み
- Java
- mainクラスのpublicの意味を教えて下さい
お早う御座います、JAVA初心者です、宜しくお願いします。 main クラスの public をコメントアウトしてもエラーもなく走ります。 これは、「public static void main(String[] args)」を持っているクラスを自動的に「main クラス」と判断しているということでしょうか。 ============================================================ class Sub { void disp() { System.out.println(" a "); } } /*public*/ class Main { public static void main(String[] args) { Sub s = new Sub(); s.disp(); } }
- ベストアンサー
- Java
- Javaについて教えてください。
Javaのソースコードで以下のコードを実行すると表示されないのですがなぜでしょうか? public class Sample{ public static void main(String[] args){ for (int i = 0 ; i >= 5; i++){ System.out.println(i); } } }
- 締切済み
- Java
- java 入力命令
以下うまくどうさしません、教えてください。 public class Main { public static void main(String[] args){ System.out.println("名前"); String name = new java.util.Scanner(System.in) .nextLine(); System.out.println("年齢"); int age = new java.util.Scanner(System.in) .nextInt(); System.out.println (age + name); } }
- 締切済み
- Java
- Integer クラスについて教えて下さい
今晩は、java初心者です、宜しくお願いします。 Integerクラスについて下のように「i1 = new Integer("1");」と書いても「i2 = new Integer(1);」 と書いても、どちらも数字として認識されているようです。 正式な書き方としてはどちらなんでしょうか、宜しくお願いします。 ========================================================================= public class Test1 { public static void main(String[] args) { Integer i1 = new Integer("1"); System.out.println((i1+2)); Integer i2 = new Integer(1); System.out.println((i2+3)); } }
- ベストアンサー
- Java
お礼
わかりやすく教えていただきありがとうございました。