方法在什么情況下會(huì)聲明為靜態(tài)的呢?方法實(shí)際上描述的是行為動(dòng)作,我認(rèn)為當(dāng)某個(gè)動(dòng)作在觸發(fā)的時(shí)候需要對(duì)象的參與,這個(gè)方法應(yīng)該定義為實(shí)例方法,例如:每個(gè)玩籃球的人都會(huì)打籃球,但是你打籃球和科比打籃球最終的效果是不一樣的,顯然打籃球這個(gè)動(dòng)作存在對(duì)象差異化,該方法應(yīng)該定義為實(shí)例方法。再如:每個(gè)高中生都有考試的行為,但是你考試和學(xué)霸考試最終的結(jié)果是不一樣的,一個(gè)上了“家里蹲大學(xué)”,一個(gè)上了“清華大學(xué)”,顯然這個(gè)動(dòng)作也是需要對(duì)象參與才能完成的,所以考試這個(gè)方法應(yīng)該定義為實(shí)例方法。
以上描述是從設(shè)計(jì)思想角度出發(fā)來(lái)進(jìn)行選擇,其實(shí)也可以從代碼的角度來(lái)進(jìn)行判斷,當(dāng)方法體中需要直接訪問(wèn)當(dāng)前對(duì)象的實(shí)例變量或者實(shí)例方法的時(shí)候,該方法必須定義為實(shí)例方法,因?yàn)橹挥袑?shí)例方法中才有this,靜態(tài)方法中不存在this。請(qǐng)看代碼:
public class Customer {
String name;
public Customer(String name){
this.name = name;
}
public void shopping(){
//直接訪問(wèn)當(dāng)前對(duì)象的name
System.out.println(name + "正在選購(gòu)商品!");
//繼續(xù)讓當(dāng)前對(duì)象去支付
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:運(yùn)行結(jié)果
在以上的代碼中,不同的客戶購(gòu)物,最終的效果都不同,另外在shopping()方法中訪問(wèn)了當(dāng)前對(duì)象的實(shí)例變量name,以及調(diào)用了實(shí)例方法pay(),所以shopping()方法不能定義為靜態(tài)方法,必須聲明為實(shí)例方法。
另外,在實(shí)際的開發(fā)中,“工具類”當(dāng)中的方法一般定義為靜態(tài)方法,因?yàn)楣ぞ哳惥褪菫榱朔奖愦蠹业氖褂茫瑢⒎椒ǘx為靜態(tài)方法,比較方便調(diào)用,不需要?jiǎng)?chuàng)建對(duì)象,直接使用類名就可以訪問(wèn)。請(qǐng)看以下工具類,為了簡(jiǎn)化“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:測(cè)試工具類