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?
答案 0 :(得分:1)
当您致电new TestA()
时,TestA
构造函数会运行。
当您致电new TestB()
时,TestB
构造函数和 TestA
构造函数都会运行。
x
构造函数看到的TestA
与x
构造函数看到的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