文档

Java™ 教程-Java Tutorials 中文版
理解类成员
Trail: Learning the Java Language
Lesson: Classes and Objects
Section: More on Classes

理解类成员

在本节中,我们讨论使用 static 关键字来创建属于类的字段和方法,而不是类的实例。

类变量

当多个对象是从同一个类蓝图创建的时候,它们都有自己独立的 instance variables (实例变量) 副本。在 Bicycle 类中,实例变量为 cadencegearspeed。每个 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;
}

并非所有实例和类变量和方法的组合都是允许的:

常量

static 修饰符在与 final 修饰符结合使用时,也用于定义常量。final 修饰符表示此字段的值不能更改。

例如,以下变量声明定义了一个名为 PI 的常量,其值是 pi 的近似值(圆周长与直径的比值):

static final double PI = 3.141592653589793;

以这种方式定义的常量不能重新分配,如果你的程序尝试这样做,则它是编译时错误。按照规范,常量值的名称拼写为大写字母。如果名称由多个单词组成,则单词由下划线(_)分隔。


注意: 如果将基本类型或字符串定义为常量并且该值在编译时已知,则编译器会将代码中的常量名称替换为其值。这称为 编译时常量。如果外部世界中常量的值发生变化(例如,如果法律规定 pi 实际应为 3.975),则需要重新编译使用此常量的任何类以获取当前值。

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

Previous page: Controlling Access to Members of a Class
Next page: Initializing Fields