- 静态域
如果将域定义为static,每个类中只有这样一个域.而每一个对象对于所有的实例域却都有自己的一份拷贝.例如需要给每一个雇员赋予唯一的标识码.这里给Employee类添加一个实例域id和一个静态域nextId:
class Employee{ private static int nextId = 1; private int id; ...... }
现在每个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域.换句话说,如果有1000个Employee类的对象,则有1000个实例域id,但是,只有一个静态域nextId.即使没有一个雇员对象,静态域nextId也存在.它属于类,而不属于任何独立的对象.
- 静态常量
静态变量使用得比较少,但静态常量却使用得比较多.例如,在Math类中定义了一个静态常量:
public class Math{ .... public static final double PI = 3.1415926; .... }
在程序中,可以采用Math.PI的形式获得这个常量.
如果关键字static被省略,PI就变成了Math类的一个实例域.需要通多Math类的对象访问PI,并且每一个Math对想都有它自己的一份PI拷贝.
- 静态方法
静态方法是一种不能向对象实施操作的方法.例如Math类的pow方法就是一个静态方法.表达式
Math.pow(x,a);
在运算时,不使用任何Math对象.换句话说,没有隐式的参数.
可以认为静态方法是没有this参数的方法(在一个非静态方法中,this参数表示这个方法的隐式参数)
Employee类的静态方法不能访问Id实例域,因为它不能操作对象.但是,静态方法可以访问自身类中的静态域.
public static int getNextId(){ return nextId; }
可以通过类名调用这个方法
int n = Employee.getNextId();
注意:可以使用对象调用静态方法.例如,如果harry是一个Employee对象,可以使用Harry.getNextId()代替Employee.getNextId().不过,这种方式和容易造成混淆,其原因是getNextId方法计算的结果与harry毫无关系,所以建议使用类名,而不是对象来调用静态方法
一般在下面两种情况下使用静态方法:
- 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)
- 一个方法只需要访问类的静态域(例如:Employee.getNextId())