Java里的“隐身王者”:static关键字居然有这么多门道!

42 阅读2分钟

提起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 = 属于类,不属于对象;加载时执行,全局共享;适合做工具、存常量、初始化配置——别再只把它当“全局变量开关”啦!