1.方法詳解
2.方法所屬性
3.方法參數(shù)傳遞機(jī)制
4.方法多變參數(shù)
方法詳解
方法是類或?qū)ο蟮男袨樘卣鞯某橄?方法是類或?qū)ο笞钪匾慕M成部分猾漫。但從功能上來看粪牲,方法完全類似于傳統(tǒng)結(jié)構(gòu)化程序設(shè)計(jì)里的函數(shù)步悠。值得指出的是尚氛,Java里的方法不能獨(dú)立存在盾饮,所有的方法都必須定義在類里细办。方法在邏輯上要么屬于類,要么屬于對(duì)象罪针。
方法所屬性
不論是從定義方法的語法來看彭羹,還是從方法的功能來看,都不難發(fā)現(xiàn)方法和函數(shù)之間的相似性泪酱。實(shí)際上派殷,方法確實(shí)是由傳統(tǒng)的函數(shù)發(fā)展而來的,方法與傳統(tǒng)的函數(shù)有著顯著不同:在結(jié)構(gòu)化編程語言里墓阀,函數(shù)是一等公民毡惜,整個(gè)軟件由一個(gè)個(gè)的函數(shù)組成;在面向?qū)ο缶幊陶Z言里斯撮,類才是一等公民经伙,整個(gè)系統(tǒng)由一個(gè)個(gè)的類組成。因此在Java語言里勿锅,方法不能獨(dú)立存在帕膜,方法必須屬于類或?qū)ο蟆?/p>
因此枣氧,如果需要定義方法,則只能在類體內(nèi)定義垮刹,不能獨(dú)立定義一個(gè)方法达吞。一旦將一個(gè)方法定義在某個(gè)類內(nèi),如果這個(gè)方法使用了static修飾荒典,則這個(gè)方法屬于這個(gè)類酪劫,否則這個(gè)方法屬于這個(gè)類的實(shí)例。
Java語言是靜態(tài)的种蝶。一個(gè)類定義完成后契耿,只要不再重新編譯這個(gè)類文件,該類和該類的對(duì)象所擁有的方法是固定的螃征,永遠(yuǎn)都不會(huì)改變搪桂。
Java里的方法不能獨(dú)立存在,它必須屬于一個(gè)類或一個(gè)對(duì)象盯滚,因此方法也不能像函數(shù)那樣被獨(dú)立執(zhí)行踢械,執(zhí)行方法時(shí)必須使用類或?qū)ο髞碜鳛檎{(diào)用者,即所有方法都必須使用“類.方法”或“對(duì)象.方法”的形式來調(diào)用魄藕。這里可能產(chǎn)生一個(gè)問題:同一個(gè)類里不同方法之間相互調(diào)用時(shí)内列,不就可以直接調(diào)用嗎?這里需要指出:同一個(gè)類的一個(gè)方法調(diào)用另外一個(gè)方法時(shí)背率,如果被調(diào)用方法是普通方法话瞧,則默認(rèn)使用this作為調(diào)用者;如果調(diào)用者是靜態(tài)方法寝姿,則默認(rèn)使用類作為調(diào)用者交排。也就是說,表面上看起來某些方法可以被獨(dú)立執(zhí)行饵筑,但實(shí)際上還是使用this或者類來作為調(diào)用者埃篓。
永遠(yuǎn)不要把方法當(dāng)初獨(dú)立存在的實(shí)體,正如現(xiàn)實(shí)世界由類和對(duì)象組成根资,而方法只能作為類和對(duì)象的附屬架专,Java語言里的方法也是一樣。Java語言里方法的所屬性主要體現(xiàn)在如下幾個(gè)方面:
- 方法不能獨(dú)立定義玄帕,方法只能在類體里定義
- 從邏輯意義上來看部脚,方法要么屬于該類本身,要么屬于該類的一個(gè)對(duì)象裤纹。
- 永遠(yuǎn)不能獨(dú)立執(zhí)行方法睛低,執(zhí)行方法必須使用類或?qū)ο笞鳛檎{(diào)用者。
使用static修飾的方法屬于這個(gè)類本身,使用static修飾的方法即可以使用類作為調(diào)用者來調(diào)用钱雷,也可以使用對(duì)象作為調(diào)用者來調(diào)用。但值得指出的是吹零,因?yàn)槭褂胹tatic修飾的方法還是屬于這個(gè)類的罩抗,因此使用該類的任何對(duì)象來調(diào)用這個(gè)方法時(shí)將會(huì)得到相同的執(zhí)行結(jié)果,因?yàn)閷?shí)際上還是使用這些實(shí)例所屬的類作為調(diào)用者灿椅。
沒有static修飾的方法則屬于該類的對(duì)象套蒂,不屬于這個(gè)類本身。因此沒有static修飾的方法只能使用對(duì)象作為調(diào)用者調(diào)用茫蛹,不能使用類作為調(diào)用者調(diào)用操刀。
方法參數(shù)傳遞機(jī)制
前面已經(jīng)介紹了Java里的方法是不能獨(dú)立存在的,調(diào)用方法必須使用類或?qū)ο笞鳛橹髡{(diào)用者婴洼。如果聲明方法時(shí)包含了形參聲明骨坑,則調(diào)用方法時(shí)必須給這些形參指定參數(shù)值,調(diào)用方法時(shí)實(shí)際傳給形參的參數(shù)值也被稱為實(shí)參柬采。
那么欢唾,Java的實(shí)參值時(shí)如何傳入方法的呢?這是由Java方法的參數(shù)傳遞機(jī)制來控制的粉捻,Java里方法的參數(shù)傳遞方式只有一種:值傳遞礁遣。所謂值傳遞,就是將實(shí)際參數(shù)值的副本(復(fù)制品)傳入方法內(nèi)肩刃,而參數(shù)本身不會(huì)受到任何影響祟霍。
Java里的參數(shù)傳遞類似于《西游記》里的孫悟空,孫悟空復(fù)制出一個(gè)假孫悟空盈包,這個(gè)假孫悟空具有和真孫悟空相同的能力沸呐,可打怪或除妖。但不管這個(gè)假孫悟空身上發(fā)生了什么事情续语,真孫悟空不會(huì)受到任何影響垂谢。與此類似,傳入方法的是實(shí)際參數(shù)值的復(fù)制品疮茄,不管方法中對(duì)這個(gè)復(fù)制品如何操作滥朱,實(shí)際參數(shù)值本身不會(huì)受到任何影響。
發(fā)福利:
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("swap---->" + "a = " + a + ", b = " + b);
}
public static void main(String[] args) {
int a = 1, b = 2;
swap(a, b);
System.out.println("main---->" + "a = " + a + ", b = " + b);
}
//打印結(jié)果:
//swap---->a = 2, b = 1
//main---->a = 1, b = 2
從上面運(yùn)行結(jié)果來看力试,swap方法里a和b的值是2徙邻、1,交換結(jié)束后畸裳,變量a和b的值依然是1缰犁、2.從這個(gè)運(yùn)行結(jié)果可以看出,main方法里的a和b,并不是swap方法里的a和b帅容。正如前面講的swap方法的a和b只是意圖來說明上面程序的執(zhí)行過程颇象。
形參個(gè)數(shù)可變方法
從JDK 1.5之后,Java允許定義形參個(gè)數(shù)可變的參數(shù)并徘,從而允許方法指定數(shù)量不確定的類型后增加三點(diǎn)( ... )遣钳,則表明該形參可以接受多個(gè)參數(shù)值,多個(gè)參數(shù)值被當(dāng)成數(shù)組傳入麦乞。下面程序定義了一個(gè)形參個(gè)數(shù)可以接受多個(gè)參數(shù)值蕴茴,多個(gè)參數(shù)值被當(dāng)成數(shù)組傳入。下面程序定義了一個(gè)形參個(gè)數(shù)可變的方法姐直。
發(fā)福利:
public static void main(String[] args) {
test(0, "s1", "s2");
}
// 定義了形參個(gè)數(shù)可變的方法
public static void test(int a, String... strings) {
for (String s : strings) {
// strings被當(dāng)成數(shù)組處理
System.out.println("形參之一---->" + s);
}
System.out.println("普通參數(shù)---->" + a);
}
// 控制打印結(jié)果
// 形參之一---->s1
// 形參之一---->s2
// 普通參數(shù)---->0
從上面運(yùn)行結(jié)果可以看出倦淀,當(dāng)調(diào)用test方法時(shí),strings形參可以傳入多個(gè)字符串作為參數(shù)值声畏。從test的方法體代碼來看撞叽,形參個(gè)數(shù)可變的參數(shù)其實(shí)就是一個(gè)數(shù)組參數(shù),也就是說砰识,下面兩個(gè)方法簽名的效果完全一樣能扒。
// 以可變個(gè)數(shù)形參定義方法
public static void test(int a, String... strings) {}
// 以數(shù)組形參定義方法
public static void test(int a, String[] strings){}
這兩種形式都包含了一個(gè)名為strings的形參,在兩個(gè)方法的方法體內(nèi)都可以把strings當(dāng)成數(shù)組處理辫狼。但區(qū)別是調(diào)用兩個(gè)方法時(shí)存在差別初斑,對(duì)于以可變形參的形式定義的方法,調(diào)用方法時(shí)更加簡潔膨处,如下面代碼所示见秤。
test(0,"s1","s2"){}
傳給strings參數(shù)的實(shí)參數(shù)值無需是一個(gè)數(shù)組,但如果使用數(shù)組形參來聲明方法真椿,調(diào)用時(shí)則必須給該形參一個(gè)數(shù)組鹃答,如下所示。
test(0,new String[]{"s1","s2"}
對(duì)比兩種調(diào)用test方法的代碼突硝,明顯第一種形式更加簡潔测摔。實(shí)際上,即使是采用形參個(gè)數(shù)可變的形式來定義方法解恰,調(diào)用該方法時(shí)也一樣可以為個(gè)數(shù)可變的形參傳入一個(gè)數(shù)組锋八。
最后還要指出的是,數(shù)組形式的形參可以出現(xiàn)在參數(shù)列表的任意位置护盈,但個(gè)數(shù)可變的形參只能處于形參列表的最后挟纱。也就是說,一個(gè)方法中最多只能又一個(gè)長度可變的形參腐宋。
長度可變的形參只能處于形參列表的最后紊服。一個(gè)方法中最多只能包含一個(gè)長度可變的形參檀轨。調(diào)用包含一個(gè)長度可變形參的方法時(shí),這個(gè)長度可變的形參即可以傳入多個(gè)參數(shù)欺嗤,也可以傳入一個(gè)數(shù)組参萄。
喜歡有幫助的話: 雙擊、評(píng)論煎饼、轉(zhuǎn)發(fā)拧揽,動(dòng)一動(dòng)你的小手讓更多的人知道!關(guān)注 帥比-楊
摘自:李剛〔瘋狂java〕