201671010145 2016-2017《Java程序設計》靜態域與靜態方法
1.靜態域
如果將域定義為static,那麽每個類中只有一個這樣的域。而每一個對象對於所有的實例域卻都有自己的一份拷貝。例如,假定需要給每一個雇員賦予唯一的表示碼。這裏給Employee類添加一個實例域id和一個靜態域nextld:
class Employee
{
private int id;
private static int nextId=1;
}
現在,每一個雇員對象都有一個自己的id域,但這個類的所有實例將共享一個nextid域,換句話說,如果有1000個Employee類的對象,則有1000個實例域id,但是只有一個靜態域nextid,即使沒有一個雇員對象,靜態域nextil也存在,他屬於類,而不屬於任何獨立的對象。
下面來實現一個簡單的方法:
public void setId()
{
id= nextId;
nextId++;
}
假設為harry設定雇員標識碼:
harry.setId();
那麽harry的id域被設置,並且靜態域nextId的值加1:
hurry.id= . . .;
Employee.nextId++;
2.靜態常量
靜態變量使用的比較少,但是靜態常量卻使用的比較多,例如,在Math類中定義了一個靜態常量:
public class Math
{
public static final double PI=3.14159265358979323846;
}
在程序中通過Math.PI來訪問這個常量
如果關鍵字static被省略,PI就成了Math類的一個實例域,即需要用Math類的對向來訪問PI,並且每一個Math對象都有他自己的一份PI拷貝。
已經使用多次的另一個靜態常量是System.out,他在System類中聲明:
public class System
{
public static final PrintStream out= ...;
}
3.靜態方法:
靜態方法是不能想對象實施操作的方法。例如,Math類的pow方法就是一個靜態方法。表達式計算冪,他在運行的時候,不使用任何Math對象,換句話,沒有隱式的參數。
可以認為靜態方法不能操作對象,所以不能在靜態方法中訪問實例域。但是,靜態方法可以訪問自身類中的靜態域。下面例子:
public static int getNextId()
{
return nextId;
}
可以通過類名調用這個方法:
int n=Employee.getNextId();
這個方法可以省略static,但是需要通過Employee類對象的引用調用這個方法。
201671010145 2016-2017《Java程序設計》靜態域與靜態方法