本教程适用于JDK 8。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变更了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发行说明了解所有JDK版本的新功能、增强功能以及已删除或不推荐使用的选项的信息。
在这一部分中,我们讨论使用static
关键字来创建属于类而不是类的实例的字段和方法。
当从同一类蓝图创建多个对象时,它们各自拥有自己的独立副本的实例变量。在Bicycle
类的情况下,实例变量是cadence
、gear
和speed
。每个Bicycle
对象都有它们自己的这些变量的值,存储在不同的内存位置。
有时,您希望拥有对所有对象都通用的变量。这可以通过使用static
修饰符来实现。在声明中具有static
修饰符的字段称为static
字段或class
变量。它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类的实例的情况下操作类变量。
例如,假设您想创建一些Bicycle
对象并为每个对象分配一个序列号,从第一个对象开始为1。这个ID号对于每个对象是唯一的,因此是一个实例变量。同时,您需要一个字段来跟踪已创建的Bicycle
对象的数量,以便知道要分配给下一个对象的ID是什么。这样的字段与任何个别对象都无关,而是与整个类相关。为此,您需要一个类变量numberOfBicycles
,如下所示:
public class Bicycle { private int cadence; private int gear; private int speed; // 为对象ID添加一个实例变量 private int id; // 为已实例化的Bicycle对象的数量添加一个类变量 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; // 增加Bicycles的数量 // 并分配ID号 id = ++numberOfBicycles; } // 返回ID实例变量的新方法 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
的常量,其值是圆周率的近似值(圆的周长与直径之比):
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; } }