Java静态变量与方法:static关键字基础用法

1. 为什么需要static关键字?

我们先想一个场景:如果有一个Student类,每个学生有自己的名字和年龄(这些是每个学生独立的信息),但我们还需要统计总共有多少个学生(这是所有学生共享的信息)。如果不用static,每个学生对象都要单独存一个总人数变量,这会浪费内存且容易出错。这时static关键字就派上用场了——它可以让变量和方法属于,而不是某个具体对象,实现数据共享。

2. 静态变量(类变量)

定义:用static修饰的变量称为静态变量(类变量),它属于整个类,所有通过该类创建的对象共享同一个静态变量的存储空间。

特点
- 所有对象共享一份静态变量,修改一个对象的静态变量会影响所有对象。
- 可通过类名直接访问(推荐),也可通过对象访问(不推荐,易混淆)。
- 静态变量在类加载时初始化,生命周期与类相同(JVM关闭时销毁)。

例子:用Student类统计总人数

class Student {
    // 实例变量:每个学生独立(姓名、年龄)
    String name;
    int age;
    // 静态变量:所有学生共享(统计总人数)
    static int totalStudents = 0;

    // 构造方法:创建学生对象时,总人数+1
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        totalStudents++; // 每次创建对象,总人数累加
    }

    // 打印学生信息(实例方法)
    public void showInfo() {
        System.out.println("姓名:" + name + ",年龄:" + age);
    }
}

public class TestStudent {
    public static void main(String[] args) {
        Student stu1 = new Student("张三", 20);
        Student stu2 = new Student("李四", 21);

        // 通过类名访问静态变量(推荐)
        System.out.println("总学生数:" + Student.totalStudents); // 输出:2
        stu1.showInfo(); // 输出:姓名:张三,年龄:20
        stu2.showInfo(); // 输出:姓名:李四,年龄:21
    }
}

3. 静态方法(类方法)

定义:用static修饰的方法称为静态方法(类方法),属于整个类,无需创建对象即可直接调用。

特点
- 只能访问静态成员(静态变量/静态方法),不能直接访问实例成员。
- 可通过类名直接调用(推荐),也可通过对象调用(不推荐)。
- 静态方法中无thissuper(因静态方法属于类,对象可能未创建)。

例子:工具类的静态方法(如日期格式化)

class DateUtils {
    // 静态方法:格式化日期字符串
    public static String formatDate(String dateStr) {
        // 简单示例:将"2023-10-01"转为"2023年10月01日"
        return dateStr.replace("-", "年") + "日";
    }
}

public class TestDateUtils {
    public static void main(String[] args) {
        // 直接通过类名调用静态方法,无需创建对象
        String formatted = DateUtils.formatDate("2023-10-01");
        System.out.println(formatted); // 输出:2023年10月01日
    }
}

4. 静态 vs 实例成员:核心区别

类型 静态成员(static) 实例成员(无static)
归属 属于类,所有对象共享 属于对象,每个对象独立一份
访问方式 类名直接访问 通过对象访问
生命周期 类加载时初始化,类卸载时销毁 对象创建时初始化,对象销毁时释放
访问范围 只能访问静态成员 可访问静态和实例成员

5. 静态代码块

若需在类加载时执行初始化操作(如初始化静态变量),可使用静态代码块static {})。静态代码块在类加载时执行,且仅执行一次。

例子:初始化静态变量

class Config {
    static String version; // 静态变量

    // 静态代码块:类加载时执行,初始化version
    static {
        version = "1.0.0";
        System.out.println("静态代码块执行:初始化版本号为" + version);
    }
}

public class TestConfig {
    public static void main(String[] args) {
        System.out.println("获取版本号:" + Config.version); // 输出:获取版本号:1.0.0
        System.out.println("再次获取版本号:" + Config.version); // 静态代码块仅执行一次
    }
}

6. 常见问题

  • Q:静态方法为什么不能用this?
    A:this指向当前对象,但静态方法属于类,对象可能未创建(如直接调用Student.getTotalStudents()),因此无this

  • Q:静态变量和实例变量可以同名吗?
    A:可以,但不推荐。通过对象访问时优先实例变量,通过类名访问时才访问静态变量。

  • Q:静态方法可以被继承吗?
    A:可以,但子类静态方法会“隐藏”父类静态方法(与实例方法重写不同)。

总结

static关键字的核心是让成员属于类而非对象,主要用于:
- 实现数据共享(如统计类实例数量);
- 提供工具化方法(如工具类的静态方法);
- 类加载时的初始化操作(静态代码块)。

初学者需重点区分静态与实例成员的访问规则,掌握其使用场景即可高效编写Java代码。

小夜