參考自–《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)
- 一個方法只需要訪問類的靜態域