java中static 关键字详解

static 是 Java 中的一个重要关键字,用于修饰类的成员(变量、方法、代码块和嵌套类),使其成为类级别的成员,而不是实例级别的成员。

一、static 的主要用途

1. 静态变量(类变量)

  • 特点:被类的所有实例共享,在内存中只有一份拷贝
  • 用途:当需要类的所有对象共享某个属性时使用

java

arduino 复制代码
class Counter {
    static int count = 0;  // 静态变量
    
    Counter() {
        count++;  // 所有实例共享同一个count
    }
}

2. 静态方法

  • 特点:属于类而非对象,不能访问实例成员(非静态变量/方法)
  • 用途:工具类方法、工厂方法等不需要对象状态的操作

java

arduino 复制代码
class MathUtils {
    static double add(double a, double b) {  // 静态方法
        return a + b;
    }
}

// 使用:MathUtils.add(5, 3); 无需创建实例

3. 静态代码块

  • 特点:在类加载时执行一次,用于初始化静态资源
  • 用途:初始化静态变量、加载配置文件等

java

csharp 复制代码
class Database {
    static Connection conn;
    
    static {  // 静态代码块
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

4. 静态嵌套类(静态内部类)

  • 特点:不持有外部类的引用,可以独立存在
  • 用途:当内部类不需要访问外部类实例时使用

java

csharp 复制代码
class Outer {
    static class Inner {  // 静态嵌套类
        void show() {
            System.out.println("静态内部类");
        }
    }
}

二、static 的核心特点

  1. 类级别:属于类而非特定对象

  2. 内存效率:在内存中只有一份拷贝

  3. 生命周期:随类的加载而加载,随类的消失而消失

  4. 访问限制

    • 静态方法只能直接访问静态成员
    • 不能使用 thissuper 关键字

三、static 的典型应用场景

  1. 工具类 (如 Math, Collections

  2. 常量定义 (通常配合 final 使用)

    java

    arduino 复制代码
    public static final double PI = 3.1415926;
  3. 单例模式实现

    java

    csharp 复制代码
    class Singleton {
        private static Singleton instance;
        
        private Singleton() {}
        
        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
  4. 共享资源配置(如数据库连接池)

四、static 的注意事项

  1. 过度使用可能导致内存泄漏(静态成员生命周期长)
  2. 线程安全问题:静态变量被所有线程共享,需考虑同步
  3. 测试困难:静态方法难以mock,可能影响单元测试
  4. 灵活性降低:静态方法不能被重写(没有多态性)

五、与实例成员的关键区别

特性 静态成员 实例成员
所属对象 对象实例
内存分配 类加载时分配,只有一份 每次new对象时分配
访问方式 类名.成员名 对象引用.成员名
生命周期 与类相同 与对象实例相同
能否访问实例成员 不能(除非通过对象引用) 可以
相关推荐
troyzhxu11 分钟前
列表查询的 GraphQL —— 一行代码终结你的 if-else 地狱!
java·springboot·graphql
叩码以求索19 分钟前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
孫治AllenSun1 小时前
【DataX】生产环境搭建DataX集群案例
java·开发语言·jvm
好好沉淀2 小时前
@NotBlank(message = “{xxx}“) 注解中花括号的含义
java
fīɡЙtīиɡ ℡2 小时前
内存泄漏产生的原因
java·spring·servlet
码智社3 小时前
Java实现RSA密钥生成、加密解密、加签验签
java
MemoleCard3 小时前
深度解析Java当中的锁机制
后端
wear工程师3 小时前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
Iruoyaoxh3 小时前
栈和队列~
java·开发语言