提起static,新手可能只知道“修饰变量就是全局的”,但它的玩法远不止于此——用对了能省代码、提效率,用错了全是坑,今天一次性讲透static的进阶用法~
一、static变量:不是“全局变量”这么简单
static变量属于类,而非对象,所有实例共享同一份数据,适合存“全局常量”或“共享状态”:
class Counter {
// 静态变量:所有Counter对象共享
public static int count = 0;
public Counter() {
count++; // 每创建一个对象,计数+1
}
}
public class StaticTest {
public static void main(String[] args) {
new Counter();
new Counter();
new Counter();
// 直接通过类名访问,无需创建对象
System.out.println(Counter.count); // 输出3
}
}
⚠️ 坑点:static变量存放在方法区,生命周期和JVM一致,滥用会导致内存泄漏(比如存大量临时数据)。
二、static方法:工具类的“专属身份”
static方法无需实例化就能调用,最典型的就是Math类、Arrays类的工具方法:
// 自定义静态工具方法
class StringUtils {
// 静态方法:判断字符串是否为空(无需new StringUtils)
public static boolean isEmpty(String str) {
return str == null || str.trim().length() == 0;
}
}
public class StaticMethodTest {
public static void main(String[] args) {
System.out.println(StringUtils.isEmpty("")); // true
System.out.println(StringUtils.isEmpty("hello")); // false
}
}
⚠️ 坑点:static方法里不能直接调用非static成员(因为没有对象实例),也不能用this关键字。
三、static代码块:类的“初始化神器”
static代码块在类加载时执行,且只执行一次,适合初始化静态变量、加载配置文件:
class Config {
public static String DB_URL;
// 静态代码块:类加载时执行
static {
// 模拟加载配置(实际可读properties文件)
DB_URL = "jdbc:mysql://localhost:3306/test";
System.out.println("配置已加载");
}
}
public class StaticBlockTest {
public static void main(String[] args) {
// 首次访问Config类,触发静态代码块执行
System.out.println(Config.DB_URL);
// 再次访问,静态代码块不再执行
System.out.println(Config.DB_URL);
}
}
一句话总结static
static = 属于类,不属于对象;加载时执行,全局共享;适合做工具、存常量、初始化配置——别再只把它当“全局变量开关”啦!