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
的核心特点
-
类级别:属于类而非特定对象
-
内存效率:在内存中只有一份拷贝
-
生命周期:随类的加载而加载,随类的消失而消失
-
访问限制:
- 静态方法只能直接访问静态成员
- 不能使用
this
和super
关键字
三、static
的典型应用场景
-
工具类 (如
Math
,Collections
) -
常量定义 (通常配合
final
使用)java
arduinopublic static final double PI = 3.1415926;
-
单例模式实现
java
csharpclass Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
-
共享资源配置(如数据库连接池)
四、static
的注意事项
- 过度使用可能导致内存泄漏(静态成员生命周期长)
- 线程安全问题:静态变量被所有线程共享,需考虑同步
- 测试困难:静态方法难以mock,可能影响单元测试
- 灵活性降低:静态方法不能被重写(没有多态性)
五、与实例成员的关键区别
特性 | 静态成员 | 实例成员 |
---|---|---|
所属对象 | 类 | 对象实例 |
内存分配 | 类加载时分配,只有一份 | 每次new对象时分配 |
访问方式 | 类名.成员名 | 对象引用.成员名 |
生命周期 | 与类相同 | 与对象实例相同 |
能否访问实例成员 | 不能(除非通过对象引用) | 可以 |