静态域与静态方法
静态域
如果将域定义为static,每个类中只有一个这样的域,这个类的所有对象将共享这个域,这个域称为静态域。
这个域属于类,而不属于任何独立的对象。
静态常量
静态常量使用得比较广泛,在C++中用关键字static const定义,在java中用关键字static final定义。
在java中,final修饰符大都应用于基本类型域或不可变类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类)。
例如,在Math类中定义了一个静态常量:
public class Math
{
...
public static final double PI = 3.1415926;
...
}
在这个程序中,可以使用类名.常量名(Math.PI)的形式获得这个常量,而如果关键字static被省略,PI就便国恒了Math类的一个实例域而非静态域,必须用对象名.常量名获得。
静态方法
静态方法是一种不能向对象实施操作的方法。
例如:我们常用的Math类中的pow方法(求幂)就是一个静态方法,表达式:Math.pow(x,a)。
在运算时,不适用任何Math对象,没有任何隐式参数。
静态方法也不能访问实例域,因为它不能操作对象。但是,静态方法可以访问自身类中的静态域。
栗子
代码
package StaticTest;
public class StaticTest {
public static void main(String[] args) {
//fill the staff array with three employee objects
Employee[] staff = new Employee[3];
staff[0] = new Employee("Tom", 40000);
staff[1] = new Employee("Dick", 60000);
staff[2] = new Employee("Harry", 65000);
//print out information about all Employees objects
for(Employee e : staff) {
e.setId();
System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary());
}
int n = Employee.getNextId(); //call static method
System.out.println("next avilable id=" + n);
}
}
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 double getId() {
return id;
}
public void setId() {
id = nextId; //set id to next available id
nextId++;
}
//静态方法
public static int getNextId() {
return nextId; //return static field
}
public static void main(String[] args) {
Employee e = new Employee("Herry", 50000);
System.out.println(e.getName() + " " + e.getSalary());
}
}