0x00 类变量
类变量(Class Variables),也称为静态变量(Static Variables),是在类级别声明的变量,与类的所有实例共享相同的值。与实例变量不同,类变量不属于对象的特定实例,而是属于整个类。类变量在类加载时被初始化,并且在类的所有实例之间共享相同的值。
类变量通常用于存储与整个类相关的数据,如常量、共享配置、计数器等。它们可以在类的任何方法中访问,并且无需创建类的实例即可访问。
0x01 实例变量
实例变量(Instance Variables)是在类的实例(对象)中定义的变量,每个类的实例都有一份独立的实例变量副本。它们用于存储对象的特定状态和数据,不同的对象可以有不同的实例变量值。实例变量通常在类的成员变量部分声明,而不是在方法内部。
0x02 类变量和实例变量的区别
2.1 作用范围:
实例变量:每个类的实例(对象)都有一份独立的实例变量副本,它们的值在每个对象之间可以不同。
类变量:类变量在整个类中只有一个副本,所有对象共享相同的类变量值。
2.2 初始化:
实例变量:实例变量通常在对象创建时通过构造方法初始化。每个对象可以具有不同的初始值。
类变量:类变量在类加载时被初始化,通常在类定义中赋初值。
2.3 访问方式:
实例变量:实例变量通过对象访问,即 对象名.实例变量名。
类变量:类变量可以通过类名直接访问,即 类名.类变量名。
2.4 作用域:
实例变量:实例变量的作用域限制在声明它们的类的实例中,每个对象都有自己的实例变量。
类变量:类变量的作用域在整个类内部,所有对象共享相同的类变量。
2.5 生命周期:
实例变量:实例变量的生命周期与对象的生命周期相同。当对象被垃圾回收时,实例变量也会被销毁。
类变量:类变量的生命周期在整个程序运行期间,只有在类被卸载时才会被销毁。
2.6 用途:
实例变量:用于存储每个对象的状态和数据,适合表示对象的属性。
类变量:用于存储与整个类相关的信息,例如共享的配置、常量等。
0x03 代码分析
让我们通过一个示例来更详细地说明实例变量和类变量之间的区别:
假设我们有一个名为 Person 的类,用于表示人员信息。我们可以在这个类中使用实例变量和类变量来表示人员的不同属性。
public class Person {
// 实例变量
String name; // 姓名
int age; // 年龄
// 类变量
static int totalCount = 0; // 总人数
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
totalCount++; // 每次创建对象,类变量增加
}
// 实例方法,显示人员信息
public void displayInfo() {
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
// 类方法,显示总人数
public static void displayTotalCount() {
System.out.println("Total people: " + totalCount);
}
public static void main(String[] args) {
Person person1 = new Person("Alice", 25);
Person person2 = new Person("Bob", 30);
person1.displayInfo();
person2.displayInfo();
Person.displayTotalCount(); // 访问类方法以显示总人数
}
}
代码输出
在这个示例中,Person
类有一个实例变量 name
和一个实例变量 age
,用于表示每个人的姓名和年龄。类还有一个类变量 totalCount,用于跟踪创建的总人数。
在 main
方法中,我们创建了两个 Person
对象,并分别调用了实例方法 displayInfo()
来显示每个人的信息。同时,我们还调用了类方法 displayTotalCount()
来显示总人数。
需要注意以下几点:
每个对象都有自己的 name
和 age
实例变量,它们在不同对象之间可以不同。
totalCount
类变量在所有对象之间是共享的,每次创建对象都会增加。
实例方法和类方法都可以访问实例变量和类变量,但类方法中只能访问静态(类)变量。
这个例子突显了实例变量和类变量的不同特性和用途。实例变量用于存储对象的属性,而类变量用于存储与整个类相关的信息。