静态变量 - Java

在 Java 中,静态变量是属于类的,而不是属于对象的。换句话说,静态变量在类加载时就会被分配内存,并且所有的对象实例共享同一个静态变量。静态变量的关键字是 static,它使得变量成为类的成员,而不是对象的成员。静态变量通常用于存储类的通用数据或状态,所有对象实例都可以共享这些数据。

静态变量的特点

  1. 共享:所有类的实例共享静态变量,即每个实例都访问同一个静态变量。
  2. 类加载时初始化:静态变量在类加载时就被初始化,而不需要创建对象。
  3. 内存管理:静态变量存在于方法区(永久代),它的生命周期由类的加载到类的卸载决定,而对象的实例变量在堆内存中。
  4. 访问方式:静态变量可以通过类名或对象实例访问。一般推荐通过类名来访问静态变量,保持代码清晰。

静态变量的使用场景

  • 用于存储类级别的共享数据。
  • 用于统计类的对象数量。
  • 用于常量定义。

静态变量的声明和初始化

静态变量通过在变量声明前加上 static 关键字来声明。

class Example {
    static int counter = 0;  // 静态变量

    Example() {
        counter++;  // 每创建一个对象,counter 增加 1
    }
}

代码示例:静态变量的使用

class Student {
    static int studentCount = 0;  // 静态变量,用于记录学生人数

    String name;

    // 构造方法
    Student(String name) {
        this.name = name;
        studentCount++;  // 每创建一个 Student 对象,学生人数增加 1
    }

    // 获取学生人数
    public static void displayStudentCount() {
        System.out.println("Total students: " + studentCount);
    }

    // 显示学生姓名
    public void displayStudentName() {
        System.out.println("Student Name: " + name);
    }
}

public class StaticVariableExample {
    public static void main(String[] args) {
        Student s1 = new Student("Alice");
        Student s2 = new Student("Bob");
        Student s3 = new Student("Charlie");

        // 使用类名来访问静态变量
        Student.displayStudentCount(); // 输出:Total students: 3

        // 使用对象来访问静态变量
        System.out.println(s1.studentCount); // 输出:3
        System.out.println(s2.studentCount); // 输出:3
        System.out.println(s3.studentCount); // 输出:3

        // 显示每个学生的姓名
        s1.displayStudentName(); // 输出:Student Name: Alice
        s2.displayStudentName(); // 输出:Student Name: Bob
        s3.displayStudentName(); // 输出:Student Name: Charlie
    }
}

输出结果:

Total students: 3
3
3
3
Student Name: Alice
Student Name: Bob
Student Name: Charlie
  • studentCount 是静态变量,它被所有 Student 类的对象共享。当我们创建每个 Student 对象时,studentCount 的值都会增加 1。
  • 通过类名 Student.displayStudentCount() 访问静态变量和方法。
  • 静态变量在内存中只有一份,所有的对象实例(如 s1, s2, s3)共享这一份静态变量,所以它们访问的 studentCount 值是相同的。

静态变量的访问方式

  • 通过类名访问静态变量

    ClassName.variableName
    

    推荐通过类名来访问静态变量,因为它更符合面向对象的原则。

  • 通过对象访问静态变量

    object.variableName
    

    这种方式可以访问静态变量,但不推荐这么做,因为它会误导读者,认为这是对象特有的变量。

静态变量与实例变量的区别

特性 静态变量(Static Variable)实例变量(Instance Variable)
声明位置 在类中,使用 static 关键字声明 在类中,声明时不使用 static 关键字
存储位置 存储在方法区(永久代) 存储在堆内存中,属于对象
生命周期 类加载时初始化,类卸载时销毁 对象创建时分配内存,对象销毁时释放
共享性 所有类的实例共享,只有一份 每个对象都有自己的实例变量
访问方式 通过类名或对象实例访问 通过对象实例访问
用途 用于存储类级别的共享数据或常量 用于存储对象级别的数据

静态变量常见应用

  1. 常量定义: 静态变量通常用于定义类的常量。由于常量是全局共享的,不会改变,所以通常将它们声明为 static final

    class Constants {
        public static final double PI = 3.14159;  // 常量
    }
    
    public class Test {
        public static void main(String[] args) {
            System.out.println(Constants.PI);  // 输出:3.14159
        }
    }
    
  2. 计数器或统计信息: 静态变量可以用来存储类的统计信息,例如类的实例数量。

    class Dog {
        static int dogCount = 0;  // 记录创建的狗的数量
        String name;
    
        Dog(String name) {
            this.name = name;
            dogCount++;
        }
    
        public static void displayDogCount() {
            System.out.println("Total dogs: " + dogCount);
        }
    }
    
    public class DogTest {
        public static void main(String[] args) {
            Dog dog1 = new Dog("Buddy");
            Dog dog2 = new Dog("Bella");
            Dog dog3 = new Dog("Charlie");
    
            Dog.displayDogCount();  // 输出:Total dogs: 3
        }
    }
    
  3. 类级别的共享资源: 静态变量可用于表示类级别的共享资源或配置。

    class DatabaseConnection {
        static String connectionURL = "jdbc:mysql://localhost:3306/mydb";  // 静态变量
    
        public static void connect() {
            System.out.println("Connecting to " + connectionURL);
        }
    }
    
    public class TestDatabase {
        public static void main(String[] args) {
            DatabaseConnection.connect();  // 输出:Connecting to jdbc:mysql://localhost:3306/mydb
        }
    }
    

总结

  • 静态变量是属于类的成员,而不是对象的成员,它在类的所有实例之间共享。
  • 静态变量的值可以通过类名或者对象实例访问,但建议通过类名来访问。
  • 静态变量的典型应用包括常量定义、类级别的共享数据、统计信息等。
Java碎碎念 文章被收录于专栏

来一杯咖啡,聊聊Java的碎碎念呀

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务