静态成员
1.静态域
当创建一个类的许多对象时,每个对象都有属于自己的非静态域,这些变量存储在不同的内存位置。有时,我们希望某个域被所有对象共享,或者说这个域属于整个类而不是每个对象。使用static修饰符的域被称为静态域或类变量,该类的每一个实例共享这个变量,这个变量存在于内存中的一个固定的位置。该类的任何实例都可以更改静态域的值,也可以在不创建类实例的情况下访问静态域。
例如,假设要创建多个Bicycle对象并为每个对象分配一个ID,第一个对象ID为1。此ID号对于每个对象都是唯一的,因此是一个实例变量。同时,您需要一个变量来表示Bicycle已创建的对象数,以便知道要分配给下一个对象的ID。这个域与任何单个对象无关,而与整个类有关,可以将这个域设置为静态域。例如:
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;
}
}
每当创建一个Bicycle类的实例时,numberOfBicycles的值都会加1,然后将它的值作为ID分配给这个实例。
2.静态方法
静态方法是指使用static修饰的方法。和静态域一样,它属于类,而不是某个实例。可以通过类名去调用它而不用先创建类的实例。使用下面的语法调用静态方法:
ClassName.methodName(args);
尽管也可以通过创建实例去访问类的静态方法,但不鼓励这么做。通常使用静态方法去访问静态域,例如,可以通过一个静态方法去访问Bicycle类的静态域numberOfBicycles:
public static int getNumberOfBicycles() {
return numberOfBicycles;
}
静态域、静态方法、非静态域和非静态方法之间的访问规则如下:
非静态方法可以访问其他非静态方法和非静态域;
非静态方法可以访问静态方法和静态域;
静态方法可以访问其他静态方法和静态域;
静态方法不能访问非静态方法和非静态域。
总的来说就是非静态方法可以访问所有成员,而静态方法只能访问静态成员。
3.常量
static关键字常和final关键字一起用来定义常量。final修饰符意味着域的值不能改变。例如,下面的变量定义了一个常量PI,它的值是圆周率:
static final double PI = 3.141592653589793;
被final修饰的变量一旦赋值以后就不能再修改。常量的命名规范是大写每个字母并且使用下划线(_)分隔每个单词。
如果使用fianl修饰引用类型的变量,并不是说这个变量引用的对象不能发生任何改变,而是说这个变量不能再去引用别的对象。