静态属性与类的定义相关联,并且类的定义永远只有一个。每当您在类上使用 new 关键字时,都会创建一个实例。所有实例都从静态类中保留自己的私有数据。使用类实例时,您可以访问静态变量,但反之则不行。
您使用术语常量,但我认为您可能对它的含义有些误解。常量通常被声明为不可变的 static final 值(它们永远无法更改)。您应该无法修改常量。如果您愿意,静态值可以是可变的,这就是我们有时所说的有状态单例。
考虑这两个例子...一个修改实例变量,另一个修改静态变量。
class InstanceFoo {
int i = 1000;
int resetCounter() {
i = 1000;
return i;
}
int getAndIncrement() {
return i++;
}
}
class StaticFoo {
static int i = 1000;
static int resetCounter() {
i = 1000;
return i;
}
static int getAndIncrement() {
return i++;
}
}
在第一个示例中,您需要使用实例来访问变量。即,您需要使用 new 实例化它:
InstanceFoo foo = new InstanceFoo();
System.out.println(foo.resetCounter()); // 1000
System.out.println(foo.getAndIncrement()); // 1000
System.out.println(foo.getAndIncrement()); // 1001
System.out.println(foo.getAndIncrement()); // 1002
System.out.println(foo.resetCounter()); // 1000
在第二个您访问静态值。静态可以被类定义引用:
System.out.println(StaticFoo.resetCounter()); // 1000
System.out.println(StaticFoo.getAndIncrement()); // 1000
System.out.println(StaticFoo.getAndIncrement()); // 1001
System.out.println(StaticFoo.getAndIncrement()); // 1002
System.out.println(StaticFoo.resetCounter()); // 1000
在您的示例中,您尝试通过执行resetCounter()++ 来增加计数器。由于完全不同于静态或实例的单独原因,这将不起作用。 Java 中的原始值(如整数、双精度、浮点数等)是按值传递,而不是按引用传递。
在非常简单的意义上,这意味着一旦你从像resetCounter 这样的方法返回一个原语,你实际上是在传递一个值的副本。然后您增加了副本,但与类关联的值保持不变(因为您只增加了变量的副本)。您需要在变量本身上调用后缀运算符++,而不是方法返回的值。即如果我有
class StaticFoo {
static int i = 1000;
static int get() {
return i;
}
}
System.out.println(StaticFoo.get()++); // prints 1000 and adds 1. the copy is then destroyed
System.out.println(StaticFoo.get()++); // prints 1000 and adds 1, the copy is then destroyed
System.out.println(StaticFoo.i); // prints 1000
System.out.println(StaticFoo.i++); // prints 1000 and now a postfix is applied to the static variable
System.out.println(StaticFoo.i++); // prints 1001 and another postfix is applied to the static variable
System.out.println(StaticFoo.get()); // prints 1002 because two postifx operators were applied to StaticFoo.i.
希望这可以帮助您入门。