Skip to content

static关键字

静态成员在类加载时初始化。使用类名可以访问静态成员

image-20260313173116385

静态变量

类名.静态变量可以访问静态变量

java
class User {

    static int count = 0;

    User() {
        count++;
    }

}

public class Test {
    public static void main(String[] args) {

        new User();
        new User();
        new User();

        System.out.println(User.count);//3
    }
}

静态方法

类名.静态方法()可以访问静态方法

java
class MathUtil {

    static int add(int a, int b) {
        return a + b;
    }

}

public class Test {
    public static void main(String[] args) {
        int result = MathUtil.add(3, 5);
        System.out.println(result);
    }
}

静态方法可以直接访问静态变量。

java
class Counter {

    static int count = 0;

    static void increment() {
        count++;   // 直接访问静态变量
    }

}

在同一个类中类名可以省略

java
class Counter {

    static int count = 0;

    static void increment() {
        Counter.count++;   // 直接访问静态变量
    }

}

提示

静态方法中没有this,因此无法直接访问实例变量和实例方法。

静态代码块

静态代码块(static code block)\是 Java 类中的一种特殊代码块,用于在\类加载时执行一次初始化逻辑。它使用 static {} 定义。

java
class Test {

    static {
        System.out.println("静态代码块执行");
    }

}

静态代码块在 类加载(Class Loading)时执行,并且只执行一次

多个静态代码块

Java 允许多个静态代码块,按代码顺序执行

java
class Test {

    static {
        System.out.println("静态代码块1");
    }

    static {
        System.out.println("静态代码块2");
    }

}
静态代码块1
静态代码块2

注意事项

静态成员的执行顺序

java
class Test {

    static int a = 10;

    static {
        System.out.println(a);
    }

}
  • 无法通过编译:
java
class Test {

    static {
        System.out.println(a);
    }

    static int a = 10;

}

通过对象访问静态成员

Java 中,static 成员(包括变量和方法)是属于 类本身 的,而不是某个对象实例。所以理论上 不推荐通过对象去访问 static 成员,虽然语法上是允许的。

虽然可以通过对象访问 static 成员,但这样做容易引起混淆,因为 static 成员并不属于对象。推荐使用类名来访问 static 成员,更清晰,也符合规范。

警告

使用对象访问静态成员,即使对象是null,也能正常访问,因为静态成员与对象无关