Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于java中的静态变量和复杂用法_Java_Static - Fatal编程技术网

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

关于java中的静态变量和复杂用法,java,static,Java,Static,该代码的结果是: 4. 4. 8. 我可以问一下为什么吗?我试图通过画图表来理解它。但它从来没有意义。如何将x更改为4?当调用newtesta()时,TestA构造函数运行 调用newtestb()时,TestB构造函数和TestA构造函数都会运行 TestA构造函数看到的x与TestB构造函数看到的x不同。如果将两个构造函数更改为此,它们仍将执行相同的操作: public class TestA { static int x; static TestA a; stati

该代码的结果是: 4. 4. 8.
我可以问一下为什么吗?我试图通过画图表来理解它。但它从来没有意义。如何将x更改为4?

当调用
newtesta()
时,
TestA
构造函数运行


调用
newtestb()
时,
TestB
构造函数
TestA
构造函数都会运行

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

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;}
}
另外,使用实例变量访问静态字段是非常不鼓励的,所以尽管允许,但您永远不应该这样做。编译器将实例变量替换为适合静态访问的类,如编译器所示。这意味着您的打印语句将编译为以下格式:

TestA() { TestA.x++;}

TestB(){ TestB.x += 2;}
最后,调用
runTest()
两次,每次调用将执行
TestA
构造函数两次,执行
TestB
构造函数一次,因此总之,执行
TestA
构造函数4次,执行
TestB
构造函数2次

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

2次
TestB.x+=2
表示
TestB.x=4

这就是为什么程序输出为:

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