final實例域
可以將實例域定義爲final,構建對象時必須對它進行初始化,並且在後面的操作中,不能夠對它進行修改。
靜態域
如果將域定義爲static ,每個類只有一個這樣的域,而每一個對象對於所有的實例域卻都將有自己的一份拷貝,例如:假定給每一個僱員設定一個唯一的標識碼nextId,這裏給每一個僱員添加一個實例域id和靜態域nextId,,現在每一個僱員對象都有自己的id域,但是這些僱員對象卻共享一個nextId域。也就是說,如果有1000個僱員對象,那麼就有1000個僱員id,但是隻有一個靜態域nextId。即使沒有一個僱員對象,靜態域nextId,依然存在。它屬於類,而不屬於任何獨立的對象。
public class Employee {
private static int nexdId = 1;
private int id;
}
靜態常量
靜態變量使用的比較少,但是靜態常量使用的比較多,例如:Math類中的
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
另外一個使用多次的system.out,在system類中聲明,
public static final PrintStream out = null;
這也突然使我意識到一個問題,就是如果一個類中有靜態變量,可以直接使用 類.靜態變量 的方法去調用它,我覺得是不是因爲,這是static的他是屬於類的,不屬於對象。
靜態方法
靜態方法是一種不能向對象實施操作的方法,例如Math類中的pow方法,在運算時不使用任何的Math對象,也就是說,沒有隱式的參數。
Employee類的靜態方法是沒有任何this參數的方法,Employee不能訪問自身類的實例域,因爲它不能操作對象,但是可以訪問靜態域,
public static int getNextId() {
return nexdId;
}
可以通過類名來調用這個方法,當然也可以使用對象來調用這個方法,但是這個方法與該對象沒有任何的關係,所以,建議使用類名調用該方法。
工廠方法
方法參數
其他程序設計語言將參數傳遞給方法有2種方法,按值調用,按引用調用。在Java中總是按值調用。方法參數有2種類型,①基本數據類型;②對象引用。當對象引用時,可以改變將一個基本數據的值發生改變,例如:
public static void tripValue(Employee e) {
e.salary = e.salary * 3;
}
當調用這個方法是slary的值將會×3,實現一個改變對象數據參數狀態的方法並不是一件難事。方法得到的是對象的拷貝,對象引用以及其他都將引用同一個對象。這看似好像是按引用調用,實際上還是按值調用的,下面看一個例子:
public static void swap(Employee a , Employee b) {
Employee temp = a;
a = b;
b = temp;
}
這是一個交換的函數,如果是按引用調用的,那麼對象a,b 的值將會交換,但實際上並沒有交換。
public static void main(String[] agrs) {
Employee a = new Employee("ab" , 100);
Employee b = new Employee("cd" , 200);
swap(a , b);
System.out.println(a.getName() + "\n" + a.getSalary());
}
實際上,對象引用是按值傳遞的。
Java中的方法參數使用情況:
①一個方法不能修改一個基本數據類型的參數;
②一個方法可以改變一個對象參數的狀態;
③一個方法不能讓對象參數引用一個新的對象