让A.java文件为:
class B {static int i; }
class A {
public static void main(String[] args) {
B a=new B();
B b=new B();
a.i=10;
b.i=5;
System.out.println(a.i);
}
}
为什么结果是5而不是10?
感谢。
答案 0 :(得分:6)
因为你的变量是静态的。这意味着它与类型相关,而不是与该类型的任何特定实例相关。您的代码相当于:
// These are actually ignored as far as the subsequent lines are concerned.
// The constructor will still be executed, but nothing is going to read the
// values of variables "a" and "b".
B a = new B();
B b = new B();
// Note this is the *type name*.
B.i = 10;
B.i = 5;
System.out.println(B.i);
IMO允许通过这样的表达式访问静态成员是一个设计错误 - 在某些IDE(例如Eclipse)中,如果您愿意,它最终会发出警告甚至是错误。
答案 1 :(得分:3)
这是因为您声明i
是静态的。 因此,(因此,B
的所有实例共享相同的值和内存位置。B
与类型而不是实例相关联。)
所以当你这样做时:
a.i=10;
b.i=5;
您实际上正在写入值变量。因此,为什么5
被打印出来而不是10
。
答案 2 :(得分:2)
因为i是静态变量,所以它属于类,而不属于该类的对象。
它就像一个'全局'变量....研究java中的'static'关键字。
祝你好运!答案 3 :(得分:1)
类的静态成员的值在类的所有实例之间共享。
因此,当你设置b.i = 5时,它也会将a.i设置为5。
注意,b.i和a.i实际上共享相同的内存。所以它真的是“B.i”而不是a.i或b.i。
答案 4 :(得分:0)