静态变量 - Java
在 Java 中,静态变量是属于类的,而不是属于对象的。换句话说,静态变量在类加载时就会被分配内存,并且所有的对象实例共享同一个静态变量。静态变量的关键字是 static
,它使得变量成为类的成员,而不是对象的成员。静态变量通常用于存储类的通用数据或状态,所有对象实例都可以共享这些数据。
静态变量的特点:
- 共享:所有类的实例共享静态变量,即每个实例都访问同一个静态变量。
- 类加载时初始化:静态变量在类加载时就被初始化,而不需要创建对象。
- 内存管理:静态变量存在于方法区(永久代),它的生命周期由类的加载到类的卸载决定,而对象的实例变量在堆内存中。
- 访问方式:静态变量可以通过类名或对象实例访问。一般推荐通过类名来访问静态变量,保持代码清晰。
静态变量的使用场景:
- 用于存储类级别的共享数据。
- 用于统计类的对象数量。
- 用于常量定义。
静态变量的声明和初始化
静态变量通过在变量声明前加上 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 关键字声明 |
在类中,声明时不使用 static 关键字 |
存储位置 | 存储在方法区(永久代) | 存储在堆内存中,属于对象 |
生命周期 | 类加载时初始化,类卸载时销毁 | 对象创建时分配内存,对象销毁时释放 |
共享性 | 所有类的实例共享,只有一份 | 每个对象都有自己的实例变量 |
访问方式 | 通过类名或对象实例访问 | 通过对象实例访问 |
用途 | 用于存储类级别的共享数据或常量 | 用于存储对象级别的数据 |
静态变量常见应用
-
常量定义: 静态变量通常用于定义类的常量。由于常量是全局共享的,不会改变,所以通常将它们声明为
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 } }
-
计数器或统计信息: 静态变量可以用来存储类的统计信息,例如类的实例数量。
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 } }
-
类级别的共享资源: 静态变量可用于表示类级别的共享资源或配置。
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的碎碎念呀