0

我有一个关于如何使用静态的问题,我看到了一个示例:

public class Exe {
    static int i = 47;
    public void call() {
        for (i = 0; i < 3; i++) {
            if (i == 2) {
                System.out.println("\n");
            }
        }
    }

    public Exe() {
    }

    public static void main(String[] args) {
        Exe t1 = new Exe();
        Exe t2 = new Exe();
        t2.i = 60;
        System.out.println(t1.i);
        t1.call();
        System.out.println(t2.i);
        t2.call();
    }
}

当我尝试运行它时,它打印了 60 3,我想知道为什么这里的 t2.i 是 3,我不知道 3 是从哪里来的,还有 t1.call() 和 t2.call() 的结果没有打印出来,请指教,谢谢!

4

6 回答 6

2
for(i=0; i<3;i++){
    if(i==2){
        System.out.println("\n");
    }
}

您的静态变量在此处分配/递增

不是for循环中的i(您假设它是不同的) 。

要清除云层,只需调用另一个变量j并进行循环。

for (int j = 0; j < 3; j++) {
    if (j == 2) {
        System.out.println("\n");
    }
}
于 2013-09-26T14:59:55.323 回答
1

3来自您的循环for,它重用您在调用之前static int i手动设置的相同。可能正在打印的结果,但它们只是空行。60call()println

于 2013-09-26T15:00:15.947 回答
1

static意味着类的每个实例都可以访问变量的相同的单个实例。

创建时t1,t1.i被初始化为47. 然后你创建t2. t2.it1.i是同一个变量,所以无论你是t1.i = 60还是t2.i = 60,它们都等于60

所以在你做t1.call();or之前,你要做t2.call()的第一件事就是打印出来t1.i,也就是60按照行t1.i = 60;

然后你运行t1.call()which 通过for循环。当无法通过 testfor时循环退出,并且由于是整数,因此一旦增加到,就会发生这种情况。 ii < 3ii3

运行后t1.call()i现在等于3。这意味着两者t1.it2.i因为意味着这里类的所有实例static只有一个副本。所以你打印出来,它应该等于。iExet2.i3

希望这可以帮助。

于 2013-09-26T15:05:04.987 回答
0
for (i = 0; i < 3; i++)

在此语句中,不是将 i 视为局部变量,而是将其视为您定义的类变量。至于类变量,在你的类变量 i 的 for 循环完成(i=3)值保持为 3 之后,所有实例只保留一份副本。

于 2013-09-26T15:03:08.780 回答
0

您的静态变量在所有对象中都是相同的,这是static. 这意味着当您调用时t2.i = 60;t1.i 和 t2.i 都设置为 60。然后当t1.call();您再次调用时更改这两个对象。正如其他人所解释的那样,您的 for 循环正在设置变量 i = 3。

这是因为它是一个静态变量,赋值会影响两个对象

于 2013-09-26T15:05:11.870 回答
0

静态成员不反映对象状态!

一个类的所有对象都将具有静态变量的相同副本(意思是相同的值)。如果一个对象更改了静态变量的值,由于静态变量在所有对象中保持相同的值,静态变量值将在该类的所有对象中更新。该规则反映了您的结果。

请参见以下示例:

public class StaticTest {

    static int staticA = 10;

    int intA;

    public StaticTest(int intA){
        this.intA = intA;
    }

    public static void main(String[] args) {
        StaticTest test1 = new StaticTest(10);
        System.out.println(test1.intA);
        System.out.println(test1.staticA);
        StaticTest test2 = new StaticTest(20);
        System.out.println(test2.intA);
        System.out.println(test2.staticA);
    }
}

下面是输出:

10 10 20 10

于 2013-09-26T15:44:47.643 回答