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对象时分配
访问方式 类名.成员名 对象引用.成员名
生命周期 与类相同 与对象实例相同
能否访问实例成员 不能(除非通过对象引用) 可以
相关推荐
你的人类朋友1 分钟前
什么是基础设施中间件
前端·后端
鹅是开哥2 分钟前
Redis的零食盒满了怎么办?详解缓存淘汰策略
java·redis·缓存·bootstrap
惜.己9 分钟前
jmeter中java.net.ConnectException: Connection refused: connect
java·jmeter·.net
yunmi_17 分钟前
分布式文件存储系统FastDFS(入门)
java·分布式·maven·fastdfs
K_i1341 小时前
指针步长:C/C++内存操控的核心法则
java·开发语言
宇宙超粒终端控制中心2 小时前
Java使用easypoi填充数据到word
java·spring boot·spring cloud·java-ee·easypoi
又是忙碌的一天3 小时前
java学习:四大排序
java·学习·排序算法
城管不管3 小时前
面试题(1)
java
二饭3 小时前
POI操作Docx的踩坑指南(一)
java·apache
李贺梖梖3 小时前
DAY25 综合案例
java