static 是什么意思?
当你将变量或方法声明为 static 时,它就属于类本身,而不是类的某个具体实例。这意味着,即使你创建了多个该类的对象,甚至一个对象都没创建,这个静态成员也只存在一份,并被所有对象共享。
static 关键字可用于:
- 变量
- 方法
- 代码块
- 嵌套类
静态变量(Static Variables)
示例:
public class Counter {
public static int COUNT = 0;
Counter() {
COUNT++;
}
}
COUNT 变量会被该类的所有对象共享。我们在 main 方法中创建 Counter 类的对象,并访问这个静态变量:
public class MyClass {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
System.out.println(Counter.COUNT);
}
}
// 输出:2
输出结果是 2,因为 COUNT 是静态变量,每创建一个 Counter 对象,它的值就会加 1。
你也可以通过任意对象来访问静态变量,例如 c1.COUNT。
静态方法(Static Methods)
静态方法属于类本身,而不是类的实例。因此,无需创建类的实例即可调用静态方法。它通常用于操作类的静态内容。
静态方法的限制:
- 不能直接使用类的非静态成员(变量或方法)。
- 不能使用
this或super关键字。
示例:
public class Counter {
public static int COUNT = 0;
Counter() {
COUNT++;
}
public static void increment() {
COUNT++;
}
}
静态方法也可以从类的实例中调用(虽然不推荐):
public class MyClass {
public static void main(String[] args) {
Counter.increment();
Counter.increment();
System.out.println(Counter.COUNT);
}
}
// 输出:2
输出为 2,因为 increment() 是静态方法,每次调用都会使 COUNT 加 1。
和静态变量一样,静态方法也可以通过对象引用调用(如 c1.increment()),但更推荐使用类名直接调用(如 Counter.increment())。
静态代码块(Static Blocks)
静态代码块用于初始化静态变量。这些代码块在类加载时、静态变量声明之后立即执行。
示例:
public class Saturn {
public static final int MOON_COUNT;
static {
MOON_COUNT = 62;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Saturn.MOON_COUNT);
}
}
// 输出:62
输出为 62,因为 MOON_COUNT 在静态代码块中被赋值为 62。
静态嵌套类(Static Nested Classes)
一个类可以包含静态嵌套类,该嵌套类可以通过外部类的名称直接访问。
示例:
public class Outer {
public Outer() {
}
public static class Inner {
public Inner() {
}
}
}
在上面的例子中,Inner 类可以直接作为 Outer 类的静态成员来访问:
public class Main {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
}
}
静态嵌套类的一个常见用途是在 Java 中实现 Builder 模式(Builder Pattern)。