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; } }