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对象时分配
访问方式 类名.成员名 对象引用.成员名
生命周期 与类相同 与对象实例相同
能否访问实例成员 不能(除非通过对象引用) 可以
相关推荐
float_六七4 小时前
IntelliJ IDEA双击Ctrl的妙用
java·ide·intellij-idea
能摆一天是一天5 小时前
JAVA stream().flatMap()
java·windows
颜如玉6 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员爱钓鱼6 小时前
Go语言实战案例 — 工具开发篇:实现一个图片批量压缩工具
后端·google·go
程序员的世界你不懂7 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年7 小时前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
在未来等你7 小时前
Kafka面试精讲 Day 13:故障检测与自动恢复
大数据·分布式·面试·kafka·消息队列
gb42152878 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
曾经的三心草8 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
Metaphor6928 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word