Java:为什么结果是5而不是10?

时间:2011-10-13 22:30:39

标签: java oop

让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?

感谢。

5 个答案:

答案 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)

我会从这个例子中说,静态说无论你要对那个int做什么都只能有一个赋值。所以a.i和b.i只是静态int的不同入口点。