关于java中的静态变量和复杂用法

时间:2017-12-10 06:20:08

标签: java static

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;}
}

此代码的结果是: 4 4 8 我可以问为什么?我试图通过绘制图表来理解它。但它永远没有意义。如何将x更改为4?

1 个答案:

答案 0 :(得分:1)

当您致电new TestA()时,TestA构造函数会运行。

当您致电new TestB()时,TestB构造函数 TestA构造函数都会运行。

x构造函数看到的TestAx构造函数看到的TestB不同。如果将两个构造函数更改为this,它们仍将执行相同的操作:

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()两次,每次调用将执行TestA构造函数两次,TestB构造函数执行一次,所以总而言之,执行{{1}构造函数4次,TestA构造函数2次。

结果:
4次TestB表示TestA.x++
2次TestA.x = 4表示TestB.x += 2

这就是程序输出为:

的原因
TestB.x = 4