Java官方教程(八-4)Understanding Class Members 静态字段和常量(2021.4.14)

前言

本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子;翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着来看一下橙子的翻译版啊,欢迎大家留言讨论,冲鸭!
更多相关文章点击阅读
Java官方教程目录2021最新版

Understanding Class Members

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

Class Variables

当从一个类中创建多个对象时,每个对象有独自的实例变量副本。对于Bicycle类,实例变量是cadence, gear, and speed。Bicycle类对于这些变量都有其自己的值,存储在不同的内存空间。

有时需要所有对象共有的变量,这可以通过static修饰符完成。static修饰发字段称为静态字段(static fields)或类变量(class variables)。它们与类关联,而不与任何对象关联。类的每个实例共享类变量,类变量在内存中只需存储一次。任何对象都可以更改类变量的值,可以在不创建类实例的情况下操作类变量。

例如,假定要创建一个类变量,并每每个变量分配一个序列号,该id号对于每个对象都是唯一的,因此是一个实例变量。同时需要一个字段来跟踪创建了多少对象,以便于知道下一个对象要分配的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;
    }
        ...
}

Class Methods

Java语言支持静态方法和静态变量。可以使用static修饰符来声明静态方法。应该使用类名来调用它们,而不需要创建类的实例,如:

ClassName.methodName(args)

注意:可以使用对象来引用静态方法,但并不推荐,如:

instanceName.methodName(args)

静态方法常用来访问静态字段。例如,可以在Bicycle类中添加静态方法访问numberOfBicycles静态变量:

public static int getNumberOfBicycles() {
    return numberOfBicycles;
}

实例和类变量以及方法是不能随意组合的:

  • 实例方法可以直接访问实例变量和实例方法。
  • 实例方法可以直接访问类变量和类方法。
  • 类方法可以直接访问类变量和类方法。
  • 类方法不能直接访问实例变量或实例方法,它们必须使用对象引用。 同样,类方法不能使用this关键字,因为没有可引用的实例。

Constants 常量

可以把static修饰符和final修饰符结合使用来定义常量(Constants)。final修饰符代表该字段的值不能被改变。

例如,下面声明了一个名为PI的常量,其值是pi(圆周率)的近似值:

static final double PI = 3.141592653589793;

不能重新分配以这种方式定义的常量,如果这样做会导致编译错误。按照规约,常量值用大写字母表示,如果由多个单词组成,用下划线分隔。

注意:如果在编译时将基本数据类型或字符长定义为常量,编译器将使用其值替换代码中的常量名称。这称为编译时常量(compile-time constant)。如果外界的常量庶之分发生了变化,需要重新定义。并且需要重新编译使用该常量的所有类以获取当前值。

The Bicycle Class

经过本节中的所有修改后,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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值