在一个class中定义的字段称之为实例字段。而用static修饰的字段称之为静态字段,每个类只有一个这样的字段。
实例字段在每个实例中有自己独立的空间,而静态字段只有一个共享空间,所有实例都会共享该字段。换句话说,如果有100个Employee对象,就有100个实例字段id,分别对应每一个对象,但只有一个静态字段nextId。即使没有Employee对象,静态字段nextId也存在。它属于类不属于任何单个对象。静态字段由类调用,实例字段由对象调用。如下面的程序,全局共用一个nextId。
静态方法内部,无法访问this
变量,也无法访问实例字段,它只能访问静态字段。通常情况下,通过实例变量访问静态字段和静态方法,会得到一个编译警告。
public class StaticTest {
public static void main(String[] args) {
Employee[] staff = new Employee[3];
staff [0] = new Employee("tom",40000);
staff [1] = new Employee("tom2",50000);
staff [2] = new Employee("tom3",60000);
for(Employee e : staff){
e.setId();
System.out.println("name"+e.getName()+",id="+e.getId()+",salary="+e.getSalary());
}
int n = Employee.getNextId();
System.out.println("Next available id="+n);
}
}
public 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 static int getNextId() {
return nextId;
}
public void setId() {
id = nextId;
}}