我有一个关于如何使用静态的问题,我看到了一个示例:
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()没有打印,请指教,谢谢!
答案 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
。然后创建t2
。 t2.i
和t1.i
是同一个变量,因此无论您是t1.i = 60
还是t2.i = 60
,它们都等于60
。
因此,在您执行t1.call();
或t2.call()
之前,您要做的第一件事就是按照t1.i
行打印出60
,t1.i = 60;
然后运行t1.call()
,它贯穿for
循环。当for
无法通过测试i
时i < 3
循环退出,并且由于i
是一个整数,只要i
递增到3
,就会发生这种情况t1.call()
。
运行i
后,3
现在等于t1.i
。这意味着t2.i
和static
,因为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