跳转至

Java中的static都能用来修饰什么? (1)

面试回答

面试官: Java 中的 static 都能用来修饰什么?

你: static 的核心作用是让成员脱离对象实例,变成类级别的东西。它可以修饰变量、方法、代码块、内部类和静态导入,每样都有不同的用法和坑。


  1. 静态变量(类变量) 用 static 修饰的成员变量,属于类本身,只在类加载时初始化一次,被所有实例共享。典型场景是常量、计数器、配置项。比如 public static final int MAX_SIZE = 100;。如果不用 static,每个 new 出来的对象都有一份自己的副本,浪费内存。

  2. 静态方法(类方法) static 方法同样属于类,直接用 类名.方法() 调用,不需要 new 对象。像工具类的 Math.max()Collections.sort() 全是静态方法。记住一条铁律:静态方法里不能直接访问非静态成员,因为它没有隐含的 this 引用。

  3. 静态代码块 static { ... } 在类加载时执行,且只执行一次,通常用来初始化复杂静态变量,或者加载本地库。执行顺序是:父类静态块 → 子类静态块 → 父类实例块/构造 → 子类实例块/构造。这是一道经典的面试题。

  4. 静态内部类 用 static 修饰的嵌套类,可以不依赖外部类实例直接创建。比如 new Outer.Inner()。如果没有 static,内部类会隐含持有外部类引用,容易导致内存泄漏。HashMap 里的 Node 就是静态内部类。

  5. 静态导入 import static java.lang.Math.*; 之后,可以直接写 max(1,2) 而不必写 Math.max。方便,但别滥用,否则代码可读性会下降。


顺序问题是最常考的:

deepseek_mermaid_20260613_a435ba.png

一句话:static 就是把东西从实例级别提升到类级别,要时刻注意它没有 this,且执行时机在类加载阶段。