参考自–《Java核心技术卷1》
1 静态域
如果将域定义为 static ,每个类中只有一个这样的域。而该类的每个对象对于所有的实例域都有自己的一份拷贝。如:
class Employee{
private static int nextId = 1; //静态域
private int id; //实例域
...
}
每个 Employee 对象都有一个自己的 id 域,但是这个类的所有实例(对象)将共享一个 nextId 域。即若有100个 Employee 类的对象,就有100个实例域 id;但是只有一个静态域 nextId .即使没有一个 Employee 对象,静态域 nextId 也依旧存在,它属于类,而不属于任何一个独立的对象(但静态域可以被对象修改)。
2 静态常量
静态变量使用的比较少,但静态常量使用的比较多。例如:Math 类的 PI
public class Math{
...
public static final double PI = 3.14;
...
}
在程序中,可以通过 Math.PI 的形式获得这个常量(如果 static 被省略,PI 就变成了 Math 类的一个实例域,需要通过一个 Math 类的对象访问 PI)。
System.out
也是一个经常使用的静态常量:
public class System{
...
public static final PrintStream out = ...;
...
}
注:在上述两个静态常量的定义中,都使用了 public 修饰,然而,在公有常量(final 域)中,即使有 public 其他方法也不能修改常量。
3 静态方法
静态方法是一种不能向对象实施操作的方法。例如,Math 类的 pow 方法就是一个静态方法Math.pow(x,a)
计算幂 x^a.在运算时,不能使用任何 Math 对象(即,无隐式的参数,无 this).
类的静态方法是不能访问类的实例域的,因为它不能操作对象。但是,静态方法可以访问自身类中的静态域。如:Employee 类的静态域 nextId,添加一个静态方法访问它
public static int getNextId(){
return nextId;//返回静态域
}
可以通过类名调用这个方法:int n = Employee.getNextId();
注:可以使用对象调用静态方法,但不建议。
以下情况使用静态方法:
- 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(如 Math.pow)
- 一个方法只需要访问类的静态域