方法在什么情況下會聲明為靜態(tài)的呢?方法實際上描述的是行為動作,我認為當某個動作在觸發(fā)的時候需要對象的參與,這個方法應該定義為實例方法,例如:每個玩籃球的人都會打籃球,但是你打籃球和科比打籃球最終的效果是不一樣的,顯然打籃球這個動作存在對象差異化,該方法應該定義為實例方法。再如:每個高中生都有考試的行為,但是你考試和學霸考試最終的結果是不一樣的,一個上了“家里蹲大學”,一個上了“清華大學”,顯然這個動作也是需要對象參與才能完成的,所以考試這個方法應該定義為實例方法。
以上描述是從設計思想角度出發(fā)來進行選擇,其實也可以從代碼的角度來進行判斷,當方法體中需要直接訪問當前對象的實例變量或者實例方法的時候,該方法必須定義為實例方法,因為只有實例方法中才有this,靜態(tài)方法中不存在this。請看代碼:
public class Customer {
String name;
public Customer(String name){
this.name = name;
}
public void shopping(){
//直接訪問當前對象的name
System.out.println(name + "正在選購商品!");
//繼續(xù)讓當前對象去支付
pay();
}
public void pay(){
System.out.println(name + "正在支付!");
}
}
public class CustomerTest {
public static void main(String[] args) {
Customer jack = new Customer("jack");
jack.shopping();
Customer rose = new Customer("rose");
rose.shopping();
}
}
圖11-26:運行結果
在以上的代碼中,不同的客戶購物,最終的效果都不同,另外在shopping()方法中訪問了當前對象的實例變量name,以及調(diào)用了實例方法pay(),所以shopping()方法不能定義為靜態(tài)方法,必須聲明為實例方法。
另外,在實際的開發(fā)中,“工具類”當中的方法一般定義為靜態(tài)方法,因為工具類就是為了方便大家的使用,將方法定義為靜態(tài)方法,比較方便調(diào)用,不需要創(chuàng)建對象,直接使用類名就可以訪問。請看以下工具類,為了簡化“System.out.println();”代碼而編寫的工具類:
public class U {
public static void p(int data){
System.out.println(data);
}
public static void p(long data){
System.out.println(data);
}
public static void p(float data){
System.out.println(data);
}
public static void p(double data){
System.out.println(data);
}
public static void p(boolean data){
System.out.println(data);
}
public static void p(char data){
System.out.println(data);
}
public static void p(String data){
System.out.println(data);
}
}
圖11-27:測試工具類