Java静态对象/方法问题

时间:2013-09-26 14:56:55

标签: java class static

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

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()没有打印,请指教,谢谢!

6 个答案:

答案 0 :(得分: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");
    }
}

答案 1 :(得分:1)

3来自您的for循环,它会在您拨打static int i之前重复使用您手动设置为60的{​​{1}} call()println可能的结果是正在打印,但它们只是空行。

答案 2 :(得分:1)

static表示该类的每个实例都可以访问该变量的相同单个实例。

创建t1时,t1.i初始化为47。然后创建t2t2.it1.i是同一个变量,因此无论您是t1.i = 60还是t2.i = 60,它们都等于60

因此,在您执行t1.call();t2.call()之前,您要做的第一件事就是按照t1.i行打印出60t1.i = 60;

然后运行t1.call(),它贯穿for循环。当for无法通过测试ii < 3循环退出,并且由于i是一个整数,只要i递增到3,就会发生这种情况t1.call()

运行i后,3现在等于t1.i。这意味着t2.istatic,因为i表示此处Exe类的所有实例中只有t2.i的副本。因此,您打印出3,它应该等于{{1}}。

希望这有帮助。

答案 3 :(得分:0)

for (i = 0; i < 3; i++)

在此语句中,不是将i视为局部变量,而是将其视为您定义的类变量。对于类变量,在for循环完成后,只为所有实例维护一个副本(i = 3),您的类变量的值仍为3。

答案 4 :(得分:0)

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

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

答案 5 :(得分: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