我写了以下代码:
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
来访问变量,会发生什么?
感谢。
答案 0 :(得分:0)
类可以访问自己的静态成员。
所有类都将看到相同的静态成员(忽略线程争用并发症)。
如果你创建另一个Count实例,他们都将修改同一个变量。
这就是static
的意思......
答案 1 :(得分:0)
array
在Count
的所有实例之间共享 - 他们都可以从中读取并写入它。正如您所说,如果您实例修改它,所有其他实例将看到新修改的值。
答案 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);
}
}
您不应该只将数组引用分配给私有数据成员。您需要分配内存并将值复制到其中。否则,如果输入数组的供应商使用其引用进行更新,则它将修改私有值。
太多人没有意识到为私人成员分配可变引用会破坏封装。也许你现在不会成为其中之一。