Java中的成员变量可以是静态的(static)或非静态的(non-static),它们之间存在以下主要区别:
- 存储位置:静态变量存储在方法区,而非静态变量存储在堆内存中。
- 共享性:静态变量被类的所有实例共享,而非静态变量只能被当前实例访问。
- 生命周期:静态变量随着类的加载而加载,随着类的卸载而销毁;非静态变量则随着对象的创建而创建,随着对象的销毁而销毁。
- 默认值:静态变量和非静态变量的默认值相同,都是数据类型的默认值(例如,int类型的默认值为0)。
- 访问方式:静态变量可以通过类名直接访问,也可以通过对象访问;非静态变量只能通过对象访问。
下面是一个简单的示例,展示了静态和非静态成员变量的区别:
public class Student { // 静态变量 public static int totalStudents = 0; // 非静态变量 public String name; public Student(String name) { this.name = name; totalStudents++; // 每次创建一个新对象,totalStudents都会增加 } public static void main(String[] args) { Student s1 = new Student("Alice"); Student s2 = new Student("Bob"); Student s3 = new Student("Charlie"); // 访问静态变量 System.out.println("Total students: " + Student.totalStudents); // 输出:Total students: 3 // 访问非静态变量 System.out.println("Name of s1: " + s1.name); // 输出:Name of s1: Alice System.out.println("Name of s2: " + s2.name); // 输出:Name of s2: Bob } }
在这个示例中,totalStudents
是一个静态变量,它在所有Student
对象之间共享,并且随着对象的创建而增加。而name
是一个非静态变量,每个Student
对象都有自己的name
副本。