文档

Java™ 教程
隐藏目录
理解类成员
指南: 学习Java语言
课程: 类和对象
章节: 更多关于类

理解类成员

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

类变量

当从同一类蓝图创建多个对象时,它们各自拥有自己的独立副本的实例变量。在Bicycle类的情况下,实例变量是cadencegearspeed。每个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;
}

不是所有的实例变量和类变量的组合以及方法都是允许的:

常量

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

例如,下面的变量声明定义了一个名为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;
    }
}

上一页: 控制对类成员的访问
下一页: 初始化字段