2017-12-10 5 views
-1
public class TestA { 
    static int x; 
    static TestA a; 
    static TestB b; 

    TestA() { x++;} 

    static void runTest() { 
     a = new TestA(); 
     b = new TestB(); 
    } 

    public static void main(String[] args) { 
     runTest(); 
     runTest(); 
     System.out.println(a.x); 
     System.out.println(b.x); 
     System.out.println(a.x + b.x); 
    } 
} 

class TestB extends TestA { 
    static int x; 
    TestB(){ x += 2;} 
} 

についてこのコードの結果は次のとおりです。は私がなぜ聞いても?私はグラフを描くことでそれを理解しようとしました。しかしそれは理にかなっていません。 xをどのようにして4に変更できますか?Javaで静的変数と複雑な使用

答えて

1

new TestA()に電話すると、TestAコンストラクタが実行されます。

あなたがnew TestB()を呼び出し、TestBコンストラクタTestAコンストラクタの両方の実行。

TestAコンストラクタに見られるxは、TestBコンストラクタで見られるものと同じではありません。あなたはこれに2つのコンストラクタを変更した場合、彼らはまだ同じことをするだろう:

TestA() { TestA.x++;} 

TestB(){ TestB.x += 2;} 

また、インスタンス変数を使用すると、静的フィールドは非常に落胆しているアクセスするには、それが許可されていますけれどもので、あなたがそれを行うべきではありません。コンパイラは、インスタンス変数を、コンパイラのように、静的アクセスの適切なクラスに置き換えます。それはあなたのprint文は、これと同じにコンパイル意味:

System.out.println(TestA.x); 
System.out.println(TestB.x); 
System.out.println(TestA.x + TestB.x); 

最後に、あなたが二回runTest()を呼び出し、各呼び出しはので、すべてのすべてで、1回2回TestAコンストラクタ、およびTestBコンストラクタを実行します、あなたが実行しますTestAコンストラクタを4回、コンストラクタを2回繰り返す。

結果:

4 
4 
8 

4回TestA.x++TestA.x = 4
2回TestB.x += 2は、プログラムの出力である理由であるTestB.x = 4

を意味意味します

関連する問題