静态变量
在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据。只有通过new关键字创建该类的实例对象后,系统才会为每个对象分配内存空间,存储各自的数据。有时候,开发人员会希望某些特定的数据在内存中只有一份,而且能够被一个类的所有实例对象所共享。例如某个学校所有学生共享同一个学校名称,此时完全不必在每个学生对象所占用的内存空间中都声明一个变量来表示学校名称,而可以在对象以外的空间声明一个表示学校名称的变量,让所有对象来共享。具体内存中的分配情况如图1所示。
图1 静态变量内存分配图
从图1可以看出,所有学生对象共享一个名称为schoolName的变量。在一个Java类中,要实现这种功能可以使用static关键字来修饰成员变量,该变量被称作静态变量,它可以被所有实例所共享。
静态变量可以使用如下语法来访问:
类名.变量名
了解了静态变量的声明和访问方式后,接下来通过一个案例来实现图3-18所描述的情况,如文件1所示。
文件1 Example12.java
1 class Student {
2 static String schoolName; // 声明静态变量schoolName
3 }
4 public class Example12 {
5 public static void main(String[] args) {
6 Student stu1 = new Student(); // 创建第1个学生对象
7 Student stu2 = new Student(); // 创建第2个学生对象
8 Student.schoolName = "清华大学"; // 为静态变量赋值
9 // 分别输出两个学生对象的信息
10 System.out.println("我是" + stu1.schoolName+"的学生");
11 System.out.println("我是" + stu2.schoolName+"的学生");
12 }
13 }
运行结果如图2所示。
图2 运行结果
文件2中,Student类中定义了一个静态变量schoolName,用于表示学生所在的学校,它被所有的实例对象所共享。由于schoolName是静态变量,因此可以直接使用Student.schoolName的方式进行调用,也可以通过Student的实例对象进行调用,如stu2.schoolName。在第8行代码将变量schoolName赋值为“清华大学”后,学生对象stu1和stu2的schoolName属性值均为“清华大学”。
脚下留心:static关键字注意事项
static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错,例如下面的代码是非法的。
public class Student {
public void study() {
static int num = 10; // 这行代码是非法的,编译会报错
}
}