1. 程式人生 > >java語言---靜態方法要點

java語言---靜態方法要點

1、方法又稱為函式,是一組程式碼序列,用於實現特定功能。方法的附加作用:封裝程式碼實現細節,改善程式碼組織方式,實現程式碼重用,並提高程式碼的可維護性。java語言中的方法分為兩大類:例項方法和靜態方法。其中例項方法的呼叫必須通過有意義的物件引用變數完成,因為例項方法含有一個隱含引數this,this指向物件引用變數引用的物件,這也是java語言面向物件程式設計中將方法和資料捆綁在一起的方式。而靜態方法的呼叫是通過對應的類來實現的,且靜態方法處理的資料需要通過引數顯示傳遞。

   注:靜態方法屬於類方法,它沒有和物件產生捆綁關係。

2、作為方法的呼叫者,能夠在不瞭解方法實現細節的情況下,基於方法簽名完成方法的呼叫。

3、方法的定義:

修飾符 返回值型別 方法名(引數列表)

{

方法體;

}

    注:方法的定義包含方法頭和方法體,其中方法頭含有修飾符、返回值型別、方法名和引數列表。例項方法和靜態方法在定義形式上的區別:靜態方法方法頭的修飾符含有關鍵字static。如果一個方法在執行結束時需要返回一個量值,那麼該方法頭中的返回值型別需要與這一量值的型別相同。而如果一個方法在執行結束時沒有返回值(或者說不需要返回值),那麼該方法頭中的返回值型別為void。

    注:引數列表中的各項稱為形參,相當於佔位符,只有在方法真正被呼叫的時候,才會在棧幀上為之分配記憶體空間,並把實參的值複製到形參所佔的記憶體空間。因此,實參和形參擁有不同的記憶體空間,這種傳遞引數的方式稱為值傳遞。當方法執行結束並返回主調方法時,形參以及被調方法區域性變數所佔的記憶體空間均會被釋放掉。由於java語言中的物件均位於堆中,且物件的釋放均由回收器來自動完成,所以java語言程式設計中不會存在C++語言中的重複釋放和引用已釋放物件的問題。

4、方法呼叫流程

    方法呼叫時,控制權由主調方法過渡到被調方法,並且在java棧中生成一個棧幀用於存放被調方法的形參、區域性變數、返回值以及一些中間結果。如果一個方法有返回值,該方法一定會以return 返回值;語句結束。並且在結束後,返回主調方法並釋放為被調方法所生成的棧幀。而對於無返回值的方法,其方法結束可以沒用return語句,但 return;語句可以在無返回值的方法中控制方法的執行流程,使得方法能夠提前結束。

注:編譯器有屬於自己的一套語法檢測方法,但是在有時候這種檢測方法並不是那麼智慧化。比如下面的程式碼(1)在邏輯上是正確的,但編譯會出錯。此時需要將程式碼(1)修改為程式碼(2)。

程式碼(1):
public static int sign( int  n)
{
     if(n > 0)
           return 1;
     else if(n == 0)
           return 0;
     else if(n < 0)
           return  -1;
}
程式碼(2)
public static sign(int n)
{
    if( n > 0)
         return 1;
     else if(n == 0)
         return 0;
      else
          return -1;
}

5、方法的過載

    過載方法是通過使用相同的方法名和不同的引數列表重新實現方法。在方法呼叫時,編譯器會依據實參和方法引數列表的對應關係自動匹配對應方法。也就是說方法的過載實現了以相同的方法名針對不同的傳入引數型別完成不同的處理操作。

注:當幾個過載的方法都能夠匹配時,java編譯器會選擇匹配結果最精確的一個。而當匹配結果的精確度相同時,編輯器就無法確定該選用哪一個,此時會產生編譯錯誤。如:

public static void max(int x , double y)
{
      System.out.print(x>y?x:y);
}

public static void max(double y , int x)
{
      System.out.println(x>y?x:y);
}
使用呼叫語句 max(3,4); 時,將產生編譯錯誤,並提示兩個方法均匹配。