当前位置: 首页 > 知识库问答 >
问题:

关于java中静态变量的复杂使用[重复]

华季萌
2023-03-14
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个答案

董霖
2023-03-14

当您调用< code>new TestA()时,< code>TestA构造函数运行。

当您调用< code>new TestB()时,< code>TestB构造函数和< code>TestA构造函数都会运行。

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

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 构造函数一次,因此总而言之,您执行 TestA 构造函数 4 次,执行 TestB 构造函数 2 次。

结果:
4次TestA。x表示测试。x=4
2次TestB。x=2表示测试b。x=4

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

4
4
8
 类似资料:
  • 我知道这个问题已经被问了很多很多次,我也读过很多答案,但是我不知道如何解决我的问题。以下是我的代码: 我最初确实通过更改来解决此问题: 到 虽然这确实有效,但我觉得这不是一个好方法。我读过一些关于实例变量的内容,但我不知道如何做到这一点。 谢谢

  • 问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输

  • 我试图从main方法中的类调用方法,但我一直得到这样的错误:我不能从静态上下文调用非静态变量。 多谢了。

  • 我最近开始用Java编码,我有一个关于轮盘赌/挖掘游戏(终端)的问题。 每次尝试使用“bank.amount”购买特定商品时,都会出现以下错误: 这是我的shop.java文件 如果你需要更多的代码(例如,我的主类或银行类),请随时问我!

  • 我不知道什么时候在程序中使用一个静态/非静态变量。 我理解非静态/静态变量之间的区别,但我只是不知道何时使用每一个变量。那么在上面的代码中,为什么函数不能是静态的呢?(什么时候应该是静态的?)

  • 在我的VC++2008项目中,我创建了两个文件globals.h和globals.cpp,如下所示: glboals.h: globals.cpp: 然后我在另一个文件testglboaldlg.cpp中使用全局变量,如下所示: 但得到以下链接错误: