关于java中的静态变量和复杂用法
该代码的结果是: 4. 4. 8.关于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
我可以问一下为什么吗?我试图通过画图表来理解它。但它从来没有意义。如何将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);