Java 静态关键字与相关概念

1. static 关键字概述

static 是 Java 中的修饰符,可以修饰:

  • 成员变量

  • 成员方法

  • 构造方法

2. 静态变量

static 修饰的成员变量称为静态变量(或类变量)。

特点:

  1. 被该类所有对象共享(同一个值)

  2. 可以使用类名调用或对象名调用

  3. 未赋值时初始值为 null

  4. 随着类的加载而加载,优先于对象出现

内存机制:

当执行类似 Student.teacherName = "王老师" 的赋值时:

  1. JVM 将类的字节码文件加载到方法区

  2. 在堆内存中创建静态区(静态存储位置)

  3. 静态区存放该类的所有静态变量

3. 静态方法

static 修饰的成员方法称为静态方法,多用于测试类和工具类。

特点:

  1. 只能访问静态成员变量和静态成员方法

  2. 可以使用类名调用或对象名调用

  3. 静态方法中没有 this 关键字

访问限制:

方法类型 可访问的成员
静态方法 只能访问静态成员
非静态方法 可以访问所有成员(静态和非静态)

4. 关键概念解析

this 关键字

  • 表示当前方法调用者的地址

  • 由虚拟机赋值

  • 在静态方法中不存在

加载时机:

  • 静态:随着类的加载而加载

  • 非静态:与对象相关,在对象创建时加载

5. 代码示例

public class Student {
    private String name;
    private int age;
    private String gender;
    public static String teacherName;
    
    // 构造方法
    public Student(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    
    // 非静态方法
    public void study() {
        System.out.println(name + "正在学习");
    }
    
    // 静态方法
    public static void showTeacher() {
        System.out.println("老师姓名:" + teacherName);
        // 以下代码会报错,静态方法不能访问非静态成员
        // System.out.println("学生姓名:" + name);
    }
    
    // getter 和 setter 方法
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    // 其他getter和setter方法...
}

6. 单例设计模式

使用静态变量和静态方法实现单例模式:

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {
        // 私有构造方法
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

7. main 方法解析

public static void main(String[] args) {
    // 方法体
}

各组成部分的作用:

  • public:被 JVM 调用,需要足够的访问权限

  • static:被 JVM 调用,无需创建对象,直接通过类名访问

  • void:被 JVM 调用,不需要返回值

  • main:通用名称,不是关键字,但被 JVM 识别

  • String[] args:用于接收键盘录入数据(目前较少使用)

注意事项:

由于 main 方法是静态的,测试类中的其他方法通常也需要是静态的。

8. 内存结构总结

区域 内容 加载时机
方法区 类的字节码文件 类加载时
堆内存-静态区 静态变量 类加载时
堆内存 对象实例和非静态变量 对象创建时
Logo

分享最新、最前沿的AI大模型技术,吸纳国内前几批AI大模型开发者

更多推荐