4.4 静态域与静态方法
4.4.1 静态域 如果将域定义为static,每个类中只有一个这样的域,而每一个对象对于所有的实例域却都有自己的一份拷贝。
class Employee
{
private static int nextId = 1;
private int id;
...
}
每个雇员对象都有自己的id域,但所有的类的实例将共享一个nextId域,举例说如果有1000个Employee对象,则有1000个实例域id,但是只有一个静态域nextId。即便没有Employee对象,静态域nextId仍然是存在的。这个静态域nextId属于类,但不属于独立的对象。 4.4.2 静态常量 静态常量的使用比较常见,如:
public class Math
{
...
public static final double PI = 3.1415926;
...
}
在程序中,可以采用Math.PI的形式获得这个常量。 如果关键字static被省略,PI就变成了Math类的一个实例域。需要通过Math类的对象访问PI,并且每一个Math对象都有它自己的一份PI拷贝。
4.4.3 静态方法 静态方法是一种不能向对象实施操作的方法。例如,Math类的pow方法就是一个静态方法。 Math.pow(x, a) 用来计算幂函数,在运算的时候,不适用任何Math对象,即没有隐式的参数。 可以认为静态方法是没有this参数的方法(在非静态方法中,this参数表示这个方法的隐式参数) 因为静态方法不能操作对象,所以不能在静态方法中访问实例域,但是静态方法可以访问自身的静态域。
package class_;
public class StaticTest_4_3 {
public static void main(String args[])
{
Employee[] staff = new Employee[3];
staff[0] = new Employee("Tom", 40000);
staff[1] = new Employee("Kobe", 50000);
staff[2] = new Employee("James", 50000);
}
}
class Employee
{
private static int nextId = 1;
private String name;
private double salary;
private int id;
public Employee(String n, double s)
{
name = n;
salary = s;
id = 0;
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public int getId()
{
return id;
}
public void setId()
{
id = nextId;
nextId++;
}
public static int getNextId()
{
return nextId;
}
}