在Java中,被static所修饰的成员变量或成员方法被称之为静态变量或静态方法,当成员变量或成员方法被static修饰时,它们会与该类本身相关联,而不是与该类的实例相关联。因此它们可以在不创建改类对象的情况下使用。
静态变量
静态变量是属于类的变量,它被该类的所有实例所共享。它的定义方式如下
class Example {
public static int count;
}
在这里我们定义了一个静态变量count,他能被Example的所有对象共享
public static void main(String[] args) {
System.out.println(++Example.count);
}
我们可以使用类名.变量名的方法来使用count变量,而无需先new 一个对象出来。上面代码的输出结果是1,这是因为如果我们不显式的为静态变量赋值,静态变量在Java中会被默认初始化
- 对于整形,默认值是0
- 对于浮点型,默认值是0.0
- 对于布尔型,默认值false
- 对于引用类型,默认值是null
虽然静态变量会被Java设置默认值,但还是建议在声明静态变量时为其显式的设置初始值。因为静态变量一般是被用来表示类所拥有的一些共同属性或常量。
静态方法
静态方法也被成为类方法,它们属于类而不是任何一个对象。静态方法不需要实例化就可以访问,他们可以通过类名直接调用。静态方法在Java中声明时需要被static关键字修饰
class Example {
public static int count;
static void incrCount() {
count++;
}
}
在这里我们定义了一个静态方法incrCount,它能通过类名来直接调用。
public static void main(String[] args) {
Example.incrCount();
}
我们在incrCount静态方法中增加了静态变量count的值,因为count是静态变量,因此incrCount可以访问它。
class Example {
public static int count;
int number = 10;
static void incrCount() {
int num = count + number;
}
}
当我们试图在incrCount中使用变量number时,程序给我们报了一个错误
//Non-static field 'number' cannot be referenced from a static context
这是因为我们在静态方法中调用了非静态变量,我们上面说过,静态方法是属于类的而不是属于某个对象,因此静态方法在对象实例化之前就存在了,而非静态变量是需要在对象实例化之后才存在的,因此当我们试图在静态方法中访问此时还不存在的非静态变量时就会出现错误。
静态变量与静态方法之间的关系
静态变量和静态方法之间存在紧密的联系。静态方法可以直接访问静态变量,因为它们都属于该类而非任何一个对象。此外,静态方法也可以在任何时候使用静态变量。
静态变量的值在所有对象中都是相同的,因此,当一个静态方法修改静态变量的值时,该值会即时更新,而对于所有其他调用该静态变量的方法和对象都是有效的。