1. static 关键字概述static是 Java 中一个非常重要的关键字用于修饰类的成员变量、方法、代码块和内部类。被 static 修饰的成员属于类本身而不是类的某个实例对象。这意味着无论创建多少个类的实例static 成员在内存中只有一份副本所有实例共享这份数据。2. static 修饰变量静态变量静态变量也称为类变量它在类加载时被初始化并且在整个程序运行期间只存在一份。public class Counter { // 实例变量 - 每个对象独立 private int instanceCount 0; // 静态变量 - 所有对象共享 private static int staticCount 0; public void increment() { instanceCount; staticCount; } public void display() { System.out.println(实例计数: instanceCount); System.out.println(静态计数: staticCount); } public static void main(String[] args) { Counter c1 new Counter(); Counter c2 new Counter(); c1.increment(); c1.display(); // 实例计数: 1, 静态计数: 1 c2.increment(); c2.display(); // 实例计数: 1, 静态计数: 2 } }特点内存中只有一份被所有实例共享可以通过类名.变量名直接访问常用于常量、计数器、共享配置等场景3. static 修饰方法静态方法静态方法属于类而不是类的实例。它不能直接访问非静态成员也不能使用this或super关键字。public class MathUtils { // 静态方法 - 工具类常用 public static int add(int a, int b) { return a b; } public static double calculateCircleArea(double radius) { return Math.PI * radius * radius; } // 非静态方法 - 需要创建对象才能调用 public void printInfo() { System.out.println(这是一个数学工具类); } public static void main(String[] args) { // 直接通过类名调用静态方法 int sum MathUtils.add(5, 3); // 8 double area MathUtils.calculateCircleArea(2.5); // 错误不能直接调用非静态方法 // MathUtils.printInfo(); // 编译错误 // 正确需要创建对象 MathUtils utils new MathUtils(); utils.printInfo(); } }使用场景工具类方法如 Math、Collections 中的方法工厂方法单例模式实现main 方法程序的入口4. static 代码块静态代码块在类加载时执行且只执行一次用于初始化静态变量或执行一次性的初始化操作。public class DatabaseConfig { private static String url; private static String username; private static String password; // 静态代码块 - 类加载时执行 static { System.out.println(加载数据库配置...); url jdbc:mysql://localhost:3306/mydb; username root; password password; // 这里可以读取配置文件、建立连接池等 } // 实例代码块 - 每次创建对象时执行 { System.out.println(创建 DatabaseConfig 实例); } public static void displayConfig() { System.out.println(URL: url); System.out.println(Username: username); } public static void main(String[] args) { DatabaseConfig.displayConfig(); new DatabaseConfig(); new DatabaseConfig(); } }5. static 修饰内部类静态内部类静态内部类不依赖于外部类的实例可以直接创建。它只能访问外部类的静态成员。public class OuterClass { private static String staticField 静态字段; private String instanceField 实例字段; // 静态内部类 public static class StaticInnerClass { public void display() { System.out.println(访问外部类静态字段: staticField); // 错误不能访问外部类实例字段 // System.out.println(instanceField); // 编译错误 } } // 非静态内部类成员内部类 public class InnerClass { public void display() { System.out.println(访问外部类静态字段: staticField); System.out.println(访问外部类实例字段: instanceField); } } public static void main(String[] args) { // 创建静态内部类实例 - 不需要外部类实例 OuterClass.StaticInnerClass staticInner new OuterClass.StaticInnerClass(); staticInner.display(); // 创建非静态内部类实例 - 需要外部类实例 OuterClass outer new OuterClass(); OuterClass.InnerClass inner outer.new InnerClass(); inner.display(); } }6. static 导入使用import static可以导入类的静态成员简化代码书写。// 传统导入 import java.lang.Math; // 静态导入 import static java.lang.Math.PI; import static java.lang.Math.pow; import static java.lang.Math.sqrt; import static java.lang.System.out; public class StaticImportExample { public static void main(String[] args) { // 传统方式 double area1 Math.PI * Math.pow(5, 2); System.out.println(面积: area1); // 使用静态导入 double area2 PI * pow(5, 2); out.println(面积: area2); // 计算两点距离 double distance sqrt(pow(3, 2) pow(4, 2)); out.println(距离: distance); } }7. 常见面试题与注意事项7.1 static 与 final 结合static final组合用于定义常量必须在声明时或静态代码块中初始化。public class Constants { // 声明时初始化 public static final int MAX_SIZE 100; public static final String APP_NAME MyApp; // 静态代码块中初始化 public static final double PI; static { PI 3.141592653589793; } }7.2 静态方法能否被重写静态方法不能被重写Override但可以被隐藏Hide。子类可以定义与父类同名的静态方法但这只是方法隐藏不是多态。class Parent { public static void staticMethod() { System.out.println(Parent static method); } public void instanceMethod() { System.out.println(Parent instance method); } } class Child extends Parent { // 方法隐藏不是重写 public static void staticMethod() { System.out.println(Child static method); } // 方法重写 Override public void instanceMethod() { System.out.println(Child instance method); } } public class TestOverride { public static void main(String[] args) { Parent p new Child(); // 静态方法 - 编译时绑定看引用类型 p.staticMethod(); // 输出: Parent static method // 实例方法 - 运行时绑定看实际对象类型 p.instanceMethod(); // 输出: Child instance method } }7.3 使用注意事项内存泄漏风险静态变量生命周期与类相同可能造成内存泄漏线程安全问题静态变量被所有线程共享需要同步控制测试困难静态方法难以 mock不利于单元测试过度使用滥用 static 会破坏面向对象特性8. 实战应用场景8.1 单例模式public class Singleton { // 静态变量保存唯一实例 private static Singleton instance; // 私有构造方法 private Singleton() { System.out.println(Singleton 实例创建); } // 静态方法获取实例 public static Singleton getInstance() { if (instance null) { instance new Singleton(); } return instance; } // 实例方法 public void doSomething() { System.out.println(执行操作...); } public static void main(String[] args) { Singleton s1 Singleton.getInstance(); Singleton s2 Singleton.getInstance(); System.out.println(s1 s2); // true同一个实例 s1.doSomething(); } }8.2 工具类设计public final class StringUtils { // 私有构造方法防止实例化 private StringUtils() { throw new AssertionError(工具类不应被实例化); } // 静态工具方法 public static boolean isEmpty(String str) { return str null || str.trim().isEmpty(); } public static boolean isNotEmpty(String str) { return !isEmpty(str); } public static String reverse(String str) { if (str null) return null; return new StringBuilder(str).reverse().toString(); } public static String join(String delimiter, String... parts) { if (parts null || parts.length 0) return ; StringBuilder sb new StringBuilder(); for (int i 0; i parts.length; i) { if (i 0) sb.append(delimiter); sb.append(parts[i]); } return sb.toString(); } }9. 总结static 关键字是 Java 面向对象编程中的重要概念合理使用可以实现类的共享数据和工具方法优化内存使用避免重复创建提供便捷的常量定义和静态导入支持单例模式、工厂模式等设计模式但需要注意避免滥用 static保持面向对象特性注意静态变量的线程安全问题静态方法无法访问实例成员设计时要考虑清楚合理使用静态代码块进行一次性初始化掌握 static 关键字的正确使用能够写出更高效、更清晰的 Java 代码。