Java 中 static 关键字详解(附示例)

更新于 2025-12-26

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)

静态方法属于类本身,而不是类的实例。因此,无需创建类的实例即可调用静态方法。它通常用于操作类的静态内容。

静态方法的限制:

  • 不能直接使用类的非静态成员(变量或方法)。
  • 不能使用 thissuper 关键字。

示例:

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)。