静态变量(static variable)
前言
希望这篇文章对你有帮助
文章目录
静态变量(static variable)前言1. 概念介绍2. 作用与特点2.1 生命周期长2.2 共享性强2.3 访问方式灵活
3. 实际应用场景3.1 计数器3.2 全局配置或常量3.3 工具类方法
4. 注意事项与延伸4.1 线程安全4.2 内存泄漏4.3 与常量池区别
5. 总结
1. 概念介绍
静态变量是使用 static 关键字修饰的成员变量,属于类本身而不是某个具体对象。无论创建多少个该类的对象,静态变量在内存中只有一份拷贝,由所有对象共享。
2. 作用与特点
生命周期长:静态变量在类加载时分配内存,直到类卸载时才释放。共享性强:所有该类的对象都共享同一个静态变量,修改后对所有对象可见。访问方式灵活:可以通过类名或对象名访问,推荐用类名访问以增强可读性。存储位置:静态变量存储在方法区(JDK 8 之前)或元空间(JDK 8 及以后)。
2.1 生命周期长
静态变量在类加载时分配内存,直到类卸载时才释放。即使没有创建对象,只要类被加载,静态变量就已经存在。
class Example {
static int value = 10;
static {
System.out.println("类加载,静态变量已初始化:" + value);
}
}
public class Test {
public static void main(String[] args) {
// 未创建对象,静态变量已存在
System.out.println(Example.value);
}
}
2.2 共享性强
所有对象共享同一个静态变量,任何一个对象对静态变量的修改,其他对象都能感知。
class Counter {
static int count = 0;
public Counter() {
count++;
}
}
public class Test {
public static void main(String[] args) {
Counter a = new Counter();
Counter b = new Counter();
System.out.println(Counter.count); // 输出2
}
}
2.3 访问方式灵活
静态变量可以通过类名或对象名访问,但推荐用类名访问,代码更清晰。
class Demo {
static int n = 5;
}
public class Test {
public static void main(String[] args) {
Demo d = new Demo();
System.out.println(Demo.n); // 推荐
System.out.println(d.n); // 也可以,但不推荐
}
}
3. 实际应用场景
计数器:统计类实例的个数。全局配置:存储全局配置信息或常量。工具类方法:配合静态方法实现工具类。
(详细讲解)
3.1 计数器
用于统计类被实例化的次数。
class Person {
static int total = 0;
public Person() {
total++;
}
}
public class Test {
public static void main(String[] args) {
new Person();
new Person();
System.out.println("总人数:" + Person.total); // 输出2
}
}
3.2 全局配置或常量
存储全局配置信息或常量,方便全局访问。
class Config {
static String APP_NAME = "MyApp";
static final int MAX_USER = 100;
}
public class Test {
public static void main(String[] args) {
System.out.println(Config.APP_NAME);
System.out.println(Config.MAX_USER);
}
}
3.3 工具类方法
配合静态方法,实现工具类,无需创建对象即可调用。
class MathUtil {
static int add(int a, int b) {
return a + b;
}
}
public class Test {
public static void main(String[] args) {
int sum = MathUtil.add(3, 5);
System.out.println(sum); // 输出8
}
}
4. 注意事项与延伸
线程安全:多线程环境下操作静态变量需注意同步,避免数据不一致。内存泄漏:静态变量生命周期长,若持有大对象引用,易导致内存泄漏。与常量池区别:静态变量属于类,常量池主要存储字符串常量和 final 常量。面试延伸:静态变量和实例变量的区别、静态变量的生命周期、静态变量的访问方式等。
4.1 线程安全
多线程环境下,静态变量可能被多个线程同时修改,需加锁或使用原子类保证线程安全。
class SafeCounter {
static int count = 0;
public static synchronized void increment() {
count++;
}
}
或使用原子类:
import java.util.concurrent.atomic.AtomicInteger;
class SafeCounter {
static AtomicInteger count = new AtomicInteger(0);
public static void increment() {
count.incrementAndGet();
}
}
4.2 内存泄漏
静态变量生命周期长,若引用大对象且未及时释放,可能导致内存泄漏。
class Cache {
static List
// 若data一直不清空,内存会持续增长
}
4.3 与常量池区别
静态变量属于类,常量池主要存储字符串常量和 final 常量。静态变量可以被修改,常量池中的内容不可变。
5. 总结
静态变量属于类本身,所有对象共享,适合存储全局共享数据。使用时需注意线程安全和内存管理问题。