静态域
static
关键字修饰的域
class Employee {
private static int nextId = 1;
private int id;
}
这里Employee
对象有一个实例域id
和一个静态域nextId
,每一个Employee
对象都有一个实例域id
,但是所有的对象共享一个静态域nextId
。假设有1000个Employee
对象,则有1000个实例域id
,但是,只有一个静态域nextId
。
即使没有一个Employee
对象,静态域nextId
也存在。它属于类,不属于对象。
静态常量
static final
修饰的变量为静态常量,注意这里的关键字,少一个都不是静态常量。
public class Math {
public static final double PI = 3.14159265358979323846;
}
在程序中,可以使用Math.PI
的形式获得这个常量
如果关键字static
被省略,PI
就变成了Math
类的一个实例域。需要通过Math
类的对象来访问PI
,并且每一个Math
对象都有它的一份PI
拷贝。
如果关键字final
被省略,PI
就变成了一个静态域。
静态方法
静态方法是一种不能向对象实施操作的方法。例如:Math
类的pow
方法就是一个静态方法,在运算时,不使用任何Math
对象,换句话说,没有隐式的参数this
。
因为静态方法不能操作对象,所以不能在静态方法中访问实例域,但是静态方法可以访问自身类中的静态域。可以使用对象调用静态方法,但是这样容易引起混淆,因为计算的结果与对象毫无关系,建议还是使用类名,而不是类对象调用静态方法。
在下面两种情况下使用静态方法:
-
一个方法不需要访问对象的状态,其所需的参数都是通过显式的提供(例如:
Math.pow
) -
一个方法只需访问类的静态域(例如:
Employee.getNextId
)