Java學習筆記(5):3.面向物件之方法詳解
方法是類或物件的行為特徵的抽象,方法是類或物件最重要的組成成分。但從功能上看,方法完全類似於傳統結構化程式設計裡的函式。值得指出的是,Java裡的方法不能獨立存在,所有的方法必須定義在類裡。方法在邏輯上要麼屬於類,要麼屬於物件。
1.方法的所屬性
永遠不要把方法當成獨立存在的實體,正如現實世界由類和物件組成,而方法只能作為類和物件的附屬,Java語言裡的方法也是一樣。Java語言裡方法的所屬性主要體現在以下幾個方面。
>方法不能獨立定義,方法只能在類體內定義。
>從邏輯意義上來看,方法要麼屬於該類本身,要麼屬於該類的一個物件。
>永遠不能獨立執行方法,執行方法必須使用類或物件作為呼叫者。
使用static修飾的方法屬於類本身,既可以使用類本身呼叫也可以使用物件呼叫。但值得注意的是,因為使用static修飾的方法還是屬於這個類的,因此使用該類的任何物件來呼叫這個方法時將會得到相同的執行結果,因為實際上還是使用這些例項所屬的類作為呼叫者。
沒有使用static修飾的方法則屬於該類的物件,不屬於類本身。因此沒有static修飾的方法只能用物件作為呼叫者呼叫,不能使用類作為呼叫者呼叫。使用不同物件呼叫同一個普通方法,可能得到不同的結果。
一句話,有static修飾的方法屬於類本身,可以用類以及物件呼叫;反之只能使用物件呼叫。
2.方法的引數傳遞機制
Java裡的引數傳遞方式只有一種:值傳遞。所謂值傳遞,就是將實際引數的副本(複製品)傳入方法內,而引數本身不會受到任何影響。
(1)基本型別的引數傳遞
public class PrimitiveTransferTest { public static void swap(int a , int b){ //下面三行程式碼實現a.b變數的值變換 //定義一個臨時變數來儲存a變數的值 int tmp = a; //把b的值賦給a a = b; //把臨時變數tmp的值賦給b b = tmp; System.out.println("swap方法裡,a的值是" + a + ";b的值是" + b); } public static void main(String[] args) { // TODO Auto-generated method stub int a = 6; int b = 9; swap(a , b); System.out.println("交換結束後,變數a的值是" + a + ";變數b的值是" + b); } }
程式的結果如下:
解釋:在main方法呼叫swap方法時,系統為二者分配兩個棧區同時用於儲存a.b變數,並將main方法中的a,b引數的值分別賦給swap方法中a,b引數,這時候實際上系統存在兩個a,兩個b,只是存在兩個不同的棧區。因而當呼叫swap方法時,實際上操作的是swap方法中a,b兩個引數,與main方法中的a,b引數無關。這同時反映了值傳遞的實質:當系統開始執行方法時,系統為形參執行初始化,就是把實參變數的值賦給方法的形參變數,方法裡操作的並不是實際的實參變數。
(2)引用型別的引數傳遞