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对象时分配
访问方式 类名.成员名 对象引用.成员名
生命周期 与类相同 与对象实例相同
能否访问实例成员 不能(除非通过对象引用) 可以
相关推荐
胡gh4 分钟前
如何聊懒加载,只说个懒可不行
前端·react.js·面试
用户4822137167756 分钟前
C++——纯虚函数、抽象类
后端
张同学的IT技术日记16 分钟前
必看!用示例代码学 C++ 基础入门,快速掌握基础知识,高效提升编程能力
后端
汪子熙19 分钟前
浏览器里出现 .angular/cache/19.2.6/abap_test/vite/deps 路径究竟说明了什么
前端·javascript·面试
UserNamezhangxi24 分钟前
kotlin 协程笔记
java·笔记·kotlin·协程
林太白25 分钟前
Nuxt3 功能篇
前端·javascript·后端
咖啡里的茶i34 分钟前
数字化图书管理系统设计实践(java)
java·课程设计
得物技术1 小时前
营销会场预览直通车实践|得物技术
后端·架构·测试
九转苍翎1 小时前
Java内功修炼(2)——线程安全三剑客:synchronized、volatile与wait/notify
java·thread
曲莫终1 小时前
正则表达式删除注释和多余换航
java·kotlin