Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
在本节中,我们讨论使用 static 关键字来创建属于类的字段和方法,而不是类的实例。
当多个对象是从同一个类蓝图创建的时候,它们都有自己独立的 instance variables (实例变量) 副本。在 Bicycle 类中,实例变量为 cadence,gear 和 speed。每个 Bicycle 对象都有自己的这些变量值,存储在不同的存储位置。
有时候,你想拥有所有对象通用的变量。这是通过 static 修饰符完成的。在其声明中具有 static 修饰符的字段称为 static fields (静态字段) 或 class variables (类变量)。他们与类相关联,而不是与任何对象相关联。该类的每个实例共享一个类变量,它位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类的实例的情况下操作类变量。
例如,假设你要创建多个 Bicycle 对象并为每个对象分配一个序列号,从第一个对象开始为 1。此 ID 号对每个对象都是唯一的,因此是一个实例变量。同时,你需要一个字段来跟踪已创建的 Bicycle 对象的数量,以便你知道要分配给下一个对象的 ID。这样的字段与任何单个对象无关,而是与整个类相关。为此,你需要一个类变量 numberOfBicycles,如下所示:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
// add an instance variable for the object ID
private int id;
// add a class variable for the
// number of Bicycle objects instantiated
private static int numberOfBicycles = 0;
...
}
类变量由类名称自身引用,如在
Bicycle.numberOfBicycles
这表明它们是类变量。
myBike.numberOfBicycles
你可以使用 Bicycle 构造函数来设置 id 实例变量并增加 numberOfBicycles 类变量:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;
public Bicycle(int startCadence, int startSpeed, int startGear){
gear = startGear;
cadence = startCadence;
speed = startSpeed;
// increment number of Bicycles
// and assign ID number
id = ++numberOfBicycles;
}
// new method to return the ID instance variable
public int getID() {
return id;
}
...
}
Java 编程语言支持静态方法和静态变量。静态方法,在声明中使用 static 修饰符的方法,应该用类名调用,而不需要创建类的实例,如
ClassName.methodName(args)
instanceName.methodName(args)
静态方法的常见用途是访问静态字段。例如,我们可以向 Bicycle 类添加一个静态方法来访问 numberOfBicycles 静态字段:
public static int getNumberOfBicycles() {
return numberOfBicycles;
}
并非所有实例和类变量和方法的组合都是允许的:
this 关键字,因为没有 this 引用的实例。static 修饰符在与 final 修饰符结合使用时,也用于定义常量。final 修饰符表示此字段的值不能更改。
例如,以下变量声明定义了一个名为 PI 的常量,其值是 pi 的近似值(圆周长与直径的比值):
static final double PI = 3.141592653589793;
以这种方式定义的常量不能重新分配,如果你的程序尝试这样做,则它是编译时错误。按照规范,常量值的名称拼写为大写字母。如果名称由多个单词组成,则单词由下划线(_)分隔。
Bicycle 类在本节中进行了所有修改之后,Bicycle 类现在是:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;
public Bicycle(int startCadence,
int startSpeed,
int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
id = ++numberOfBicycles;
}
public int getID() {
return id;
}
public static int getNumberOfBicycles() {
return numberOfBicycles;
}
public int getCadence() {
return cadence;
}
public void setCadence(int newValue) {
cadence = newValue;
}
public int getGear(){
return gear;
}
public void setGear(int newValue) {
gear = newValue;
}
public int getSpeed() {
return speed;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}