这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
理解类成员
在这一章中,我们讨论使用static关键字来创建属于类的字段和方法,而不是实例的。
类变量
当基于同一个类创建多个对象时,它们每一个都会拥有自己的实例变量拷贝。在Bicycle 类中,实例变量有cadence、gear和speed。每个Bicycle对象都有自己的成员变量值,它们位于内存里不同的位置。
有时,你需要声明一些变量,这些变量是所有对象共有的。这可以通过使用static修饰符来完成。声明时用static修饰符修饰的字段我们一般叫做静态变量或者类变量。它们是与类绑定的,不绑定任何对象。所有类实例共享同一个类变量,位于内存中固定的位置。任一对象都可以改变类变量的值,在类变量上的操作不需要创建类实例的。
比如,假设你想创建一批Bicycle对象,为每个对象分配一个序列号;第一个对象从1开始分配。每个对象的ID编号都是不同的,所以ID编号是实例变量。同时,你需要知道到目前为止已经创建了多少个Bicycle对象这样才能为下一个对象分配ID编号。这样一个字段是跟任一对象无关的,是类上全局的。这样你需要一个类变量 numberOfBicycles 如下所示:
public class Bicycle{
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;
···
}
类变量被类自己引用,
Bicycle.numberOfBicycles
这说明它们是类变量。
注意:你也可以使用对象来访问静态字段,
myBike.numberOfBicycles
不过一般不鼓励这样来引用静态字段,因为这样使用不能清楚的表明该字段是静态字段。
你可以在构造器中设置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 startGear,int startSpeed){
cadence = startCadence;
gear = startGear;
speed = startSpeed;
id = ++numberOfBicycles ;
}
public id getId(){
return id;
}
···
}
类方法
Java编程语言像支持静态字段一样支持静态方法。静态方法是指声明时使用static修饰的,通过类名访问,而不需要通过对象名访问的方法。
ClassName.methodName(args);
静态方法的一般用法是访问静态字段。比如,我们可以在Bicycle类中增加一个静态方法来访问静态字段numberOfBicycles :
public static int getNumberOfBicycles(){
return numberOfBicycles;
}
并不是说所有类和实例 的变量和方法组合都是允许的,比如:
- 实例方法可以访问实例变量和其他的实例方法
- 实例方法可以访问类变量和类方法
- 类方法可以访问类变量和类方法
- 类方法不能直接访问实例变量和实例方法,并且,类方法不能使用this关键字因为没有实例需要this引用
常量
static修饰符,与final修饰符组合起来,就可以用来定义常量。final修饰符指明变量的值不能再改变。
比如,如下的代码定义了一个变量叫PI,其值是pi的近似值
static final double PI = 3.141592653589793;
这种方式定义的常量不能重新赋值,如果你尝试这样做将会导致编译错误。一般来讲,常量的命名用大写字母。如果名字有多个单词组成,单词之间用(_)拼接。
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 startGear,int startSpeed){
cadence = startCadence;
gear = startGear;
speed = startSpeed;
id = ++numberOfBicycles ;
}
public id 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;
}
}