本教程适用于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;
}
}