实例变量可以在java中声明为静态变量

时间:2014-05-03 13:46:54

标签: java

我写了以下代码:

public class Count
{

    private static int[] array;

    public Count( int[] array )
    {
        this.array = array;
    }

    public int count()
    {
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            int x = array[i];
            if (x < 0) {
                if (x == -1 && i > 0 && array[i - 1] == -1) {
                    break;
                }
            } else {
                count++;
            }
        }
        return count;
    }

}

然后在我写的另一个课程中:

Count c = new Count(new int[]{1,-1,-1});

并检查c.count()的结果。 我没有得到编译器错误,我得到了1。 我想知道为什么,因为如何将静态变量分配给实例变量? 而且,如果我创建另一个类Count实例会发生什么? 他们俩都有相同的变量吗?或者只是他们自己的副本?如果我尝试通过编写Count.array来访问变量,会发生什么? 感谢。

3 个答案:

答案 0 :(得分:0)

类可以访问自己的静态成员。

所有类都将看到相同的静态成员(忽略线程争用并发症)。

如果你创建另一个Count实例,他们都将修改同一个变量。

这就是static的意思......

答案 1 :(得分:0)

arrayCount的所有实例之间共享 - 他们都可以从中读取并写入它。正如您所说,如果您实例修改它,所有其他实例将看到新修改的值。

答案 2 :(得分:0)

我建议你写下你要问和看的例子。没有比JVM更好的权威,它会比SO更快地告诉你。

我认为您应该理解类和实例变量的含义,并选择与您的意图相匹配的那个。

所以它是一个类:

public class Count
{
   // Shared by all 
   private static int[] array;
}

或实例:

public class Count
{
   // Owned by instance
   private int[] array;

   public Count(int [] v) {
       if (v == null) throw new IllegalArgumentException("array cannot be null");
       this.array = new int(v.length);
       System.arraycopy(v, this.array, 0, v.length);
   }
}

您不应该只将数组引用分配给私有数据成员。您需要分配内存并将值复制到其中。否则,如果输入数组的供应商使用其引用进行更新,则它将修改私有值。

太多人没有意识到为私人成员分配可变引用会破坏封装。也许你现在不会成为其中之一。