理解类的成员
在本节中,我们讨论使用static
关键字来创建属于类的字段和方法,而不是示例的成员。
类变量Class Variables
当一定数量的对象按照同样的类模板创建时,它们每一个都拥有不同的实例变量 的副本。在自行车类Bicycle
中,实例变量为 cadence
, gear
, 和speed
. 没一个自行车 Bicycle
对象的这些变量都有着不同的值,存储在不同的内存位置中。
有时候,你想要有对所有对象都相同的变量。这就要使用static
修饰符来完成。声明时带有static
修饰符的字段/域叫做 静态域 或者 类变量 (static fields or class variables).
它们是域类相关联的而不是任一个对象。每一个类的实例共享类变量,存储在一个固定的内存位置。任一个对象都可以改变类变量的值,并且类变量也可以在不创建任何类的实例的情况下进行操作。
例如,假设你想创建一定数量的自行 Bicycle
对象并且为每一个分配一个序号,第一个对象的开始值为1. 这个ID数字对域每一个对象都都是唯一的因此是一个实例变量。同时,你需要你个字段来跟踪已经创建了多少Bicycle
对象,这样你可以直到为下一个对象分配什么ID。这么一个字段并不是域任一个单独的对象关联的,而是对于整个类。这样你就需一个类变量, numberOfBicycles
,就像相面的例子:
|
|
类变量是通过它自身的类名来引用的,例如
|
|
这样就可以清晰的直到它们是类变量.
注意: 你同样可以使用一个对象来引用静态域如下
|
|
但是并不鼓励这么做,因为这样做并不能清除的表明它们是类变量。
你可以使用 Bicycle
构造器来为每一个实例变量id
赋值,并增加类变量 numberOfBicycles
的值:
|
|
类的方法Class Methods
Java编程语言支持静态变量的同时也支持静态方法。静态方法,在定义时使用static
修饰符,应该通过类名类直接调用,而无需创建一个类的实例,例如:
|
|
注意: 你同样可以使用一个对象来引用静态方法如下
|
|
但是并不鼓励这么做,因为这样做并不能清除的表明它们是类的方法。
静态方法一个常用的地方使用来方位静态域。例如,我们可以为Bicycle
类添加一个静态方法来访问 numberOfBicycles
静态域:
|
|
并不是所有的静态方法,静态域 与实例变量实例方法的 结合使用都使允许的:
- 实例方法可以直接访问实例变量与实例方法。
- 实例方法可以直接调用类变量以及类方法。Instance methods can access class variables and class methods directly.
- 类方法可以直接方法类变量与类方法。Class methods can access class variables and class methods directly.
- 类方法不能直接访问实例变量与实例方法——它们必须通过一个对象来引用。同样,类方法不能使用
this
关键字,因为这里的this
不能指向任何实例。
常量Constants
static
修饰符,经常与final
修饰符结合使用,用来定义常量。final
修饰符表明这个字段的值不能改变。
例如,下面的变量声明了一个常量PI
,值为pi(圆周率:圆的周长与直径的比值)的近似值:
|
|
这种方式定义的常量不能重新赋值,如果你尝试这么做的话就会得到一个编译时错误。按照管理,常量的命名单词用大写字母拼写,如果名字包含了多个单词,使用下划线_
分割.
注意:如果一个基本数据类型或者字符串被定义为常量并且值在编译时已经确知,编译器将所有代码中出现的所有常量名替换为它的值。这叫做 编译时常量 compile-time constant. 如果你使用的常量外部世界值发生改变(例如,立法确认pi的值应该为3.975),那么你就需要重新编译所以用到这个常量的类来获取当前固定值。
自行车Bicycle
类
经过所有的改变之后 Bicycle
现在如下所示:
|
|