静态域与静态方法
1.静态域
如果将域定义为static,那么每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。例如,假定需要给每一个雇员赋予唯一的表示码。这里给Employee类添加一个实例域id和一个静态域nextld:
class Employee
{
private int id;
private static int nextId=1;
}
现在,每一个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextid域,换句话说,如果有1000个Employee类的对象,则有1000个实例域id,但是只有一个静态域nextid,即使没有一个雇员对象,静态域nextil也存在,他属于类,而不属于任何独立的对象。
下面来实现一个简单的方法:
public void setId()
{
id= nextId;
nextId++;
}
假设为harry设定雇员标识码:
harry.setId();
那么harry的id域被设置,并且静态域nextId的值加1:
hurry.id= . . .;
Employee.nextId++;
2.静态常量
静态变量使用的比较少,但是静态常量却使用的比较多,例如,在Math类中定义了一个静态常量:
public class Math
{
public static final double PI=3.14159265358979323846;
}
在程序中通过Math.PI来访问这个常量
如果关键字static被省略,PI就成了Math类的一个实例域,即需要用Math类的对向来访问PI,并且每一个Math对象都有他自己的一份PI拷贝。
已经使用多次的另一个静态常量是System.out,他在System类中声明:
public class System
{
public static final PrintStream out= ...;
}
3.静态方法:
静态方法是不能想对象实施操作的方法。例如,Math类的pow方法就是一个静态方法。表达式计算幂,他在运行的时候,不使用任何Math对象,换句话,没有隐式的参数。
可以认为静态方法不能操作对象,所以不能在静态方法中访问实例域。但是,静态方法可以访问自身类中的静态域。下面例子:
public static int getNextId()
{
return nextId;
}
可以通过类名调用这个方法:
int n=Employee.getNextId();
这个方法可以省略static,但是需要通过Employee类对象的引用调用这个方法。
************************************************************
注意:可以使用对象调用静态方法。例如,如果harry是一个Employee对象,那么用harry.getNextId()来代替Employee.getNextId().