1. 程式人生 > >java基礎 方法

java基礎 方法

blog 類型 ron 使用方法 work 同名 垃圾回收器 程序計數器 ole

方法的定義和調用

方法定義,方法(Method),函數(function),其實就指一個特定的功能操作:
程序中完成獨立功能,可重復使用的一段代碼的集合;
方法定義格式:
    [修飾符]  返回值的類型  方法名稱([形式參數,....])
    {
             方法體
             [return 值];
    }
方法必須要調用才能生效(想想娶媳婦生孩子的故事/看著菜單點菜).
   如果方法使用了static修飾:
       此時我們使用方法所在類的名稱.方法名(參數);
   如果方法沒有使用static修飾:
      此時我們得使用方法所在類的對象來調用(暫且不討論,面向對象).

技術分享圖片

技術分享圖片

public static void main(String[] args)
{
      //TODO
}
main方法專門由JVM來負責調用,我們只管啟動JVM.
方法定義的位置:
    1):在類中定義,在Java中最小的程序單元是類.
    2):方法定義在其他方法之外,方法和方法是兄弟關系.
    3):方法定義的先後順序不影響.

方法中的屬於和如何定義方法

方法的定義格式:
  [修飾符]   返回值類型   方法名稱([形參1,形參2,...])
  {
         方法體;
          [如果方法需要給調用者返回一個結果,此時使用return 值];
  }

方法中的術語:
   修飾符:
public,static等,static修飾的方法屬於類,直接使用類名調用即可,現在都使用static修飾. 返回值類型: 方法其實是在完成一個功能,該功能操作完畢之後,是否需要給調用者返回一個結果. 如果不需要給調用者返回結果,此時使用關鍵字void來聲明,無返回的意思. 方法名稱:遵循標識符的規範,使用動詞表示,首字母小寫,若是多個單詞組成,使用駝峰表示法,以後的每一個單詞首字母都大寫,getEmployeeName. 形式參數:方法圓括號中的變量,僅僅只是占位而已,參數的名稱其實無所謂,形式參數可以有多個. 參數列表:參數列表
== 參數的類型 + 參數的個數 + 參數的順序. 方法簽名:方法簽名 == 方法名稱 + 方法參數列表; 在同一個類中,方法簽名是唯一的,否則編譯報錯. 方法體:方法的{}中的代碼,表示具體完成該功能的代碼. 返回值: 在方法內部,使用return關鍵字; 功能1:給調用者返回一個結果值,此時該方法不能使用void修飾. 功能2:結束當前方法. 實際參數:調用者在調用某一個具體方法的時候,實際傳遞的參數值. 方法的調用者:在哪裏調用某一個方法,那麽哪裏就是該方法的調用者.

如何定義方法:
     1):到底需要定義什麽功能方法.不要太糾結,跟著我做.
     2):是否需要定義返回值類型.
     3):是否需要形式參數.
-----------------------------------------------------------------------
1):是否需要定義返回值類型:
    我們說方法其實就是在完成某一個功能,那麽完成該功能之後,是否需要給調用者返回一個結果數據,如果不需要返回結果數據,此時使用void聲明(無返回).
    如果需要返回一個結果數據,我們就把該結果數據的類型作為該方法的返回值類型.
        打印操作:我們在乎的是方法執行的過程,而不是結果,所以此時使用void聲明.
        求兩個數之和:我們在乎的方法執行的過程,並且執行完畢之後,需要給調用者一個反饋.
2):是否需要形式參數.
       該方法在完成該功能的過程之中,是否有未知的因素參與,如果有請作為參數傳遞,如果沒有則沒有形參.
       求兩個數之和的時候,這兩個數到底是多少,其實對於方法來說,是未知的,僅僅是調用者知道,而且不同的調用者傳遞不同的參數值.
-----------------------------------------------------------------------
針對於有返回的方法,調用者應該定義一個變量去接受返回的結果.
-----------------------------------------------------------------------
a:無參數無返回,b:有參數無返回,c:無參數有返回,d:有參數有返回

技術分享圖片

技術分享圖片

方法的特點-執行流程:

技術分享圖片

方法重載設計

需求1:在同一個類中,分別定義求兩個整數,小數之和的方法.

解決方案:

技術分享圖片

需求2:在同一個類中,分別打印String,int,double,boolean類型的方法.

技術分享圖片

方法的重載設計(overload):
重載方法的定義是在同一個類中,某方法允許存在一個以上的同名方法,只要它們的參數列表不同即可。

方法重載的作用:屏蔽了同一功能的方法由於參數不同所造成方法名稱不同。

方法重載判斷原則: “兩同一不同”
兩同:同類中,方法名相同;
一不同:方法參數列表不同(參數類型、參數個數、參數順序);
        只要參數類型,參數個數,參數順序有一個不同,參數列表就不同.

註意:方法重載和方法的返回值類型無關,只是一般要求返回值類型一致。
              參數列表和參數的名稱沒關系,方法的重載和形參沒關系.

技術分享圖片

技術分享圖片

接著大家思考,為什麽System.out.println()可以打印任意類型的數據?查看源代碼,證明多個println方法的重載關系。

技術分享圖片

以下的方法都在同一個類值,且方法名都為doWork.
void doWork(int a,char b,boolean c){}
  三個參數:分別是int類型,char類型,boolean類型.
下列方法哪些是上述doWork方法的重載方法。
a. void doWork(char b, int a, boolean c){}             //YES:參數類型不同
b. int doWork(boolean a,char c ,int b){}    //YES:參數類型不同
c. void doWork(int a,char b,double c){}    //YES:參數類型不同
d. void doWork(int x,char y,boolean z){}    //編譯報錯:不是重載
e. int doWork(int x,double y){}                    //YES:參數個數不同
f. int doWork(int x, char y,boolean z){}      //編譯報錯:不是重載
理解重載的定義
重載的功能
重載的作用
判斷重載的原則:兩同一不同
兩同:同一個類中
      方法名相同
不同:參數列表不同(參數類型,參數順序,參數個數)(三個中一個不同,則參數類表就不同)
與返回值類型無關

方法遞歸操作

recursion
讀高中學數列的時候,我們見過斐波納契數列,其通項公式為:F(0)=0,F(1)=1,Fn=F(n-1) +F(n-2)(n>=3,n∈N*),現在求F(5)的值,怎麽做呢?
觀察:這個數列從第三項開始,每一項都等於前兩項之和。
要求F(5)的值,肯定要先求F(4)和F(3)的值,而求F(4)的值又需要求F(3)和F(2)的值... ...
解決辦法1:
依次求出F(1)、F(2)、F(3)、F(4)值,再處理。
這種辦法很笨,效率低極低。
方法fn的作用就是求num數的函數值,而求函數值又需要num-1和num-2的函數值,而這兩個函數值的求法和求num一樣,那麽也就可以使用同一個方法。

技術分享圖片

技術分享圖片

JVM內存模型

技術分享圖片

JVM內存劃分,人為的根據不同內存空間的存儲特點以及存儲的數據:

程序計數器:當前線程所執行的字節碼的行號指示器。
本地方法棧:為虛擬機使用的native方法服務。

Java虛擬機棧:描述Java方法執行的內存模型,每個方法被執行的時候都會同時創建一個棧幀用於存儲局部變量表、操作棧、動態鏈接、方法出口等信息。
     每一個方法,創建一個棧幀,,棧幀存放了當前方法的數據信息(局部變量),當方法調用完畢,該方法的棧幀就被銷毀了.

Java堆:被所有線程共享的一塊內存區域,在虛擬機啟動時創建。所有的對象實例以及數組都要在堆上分配(使用new關鍵字,就表示在堆中開辟一塊新的存儲空間)。

方法區:線程共享的內存區域,存儲已被虛擬機加載的類信息、常量、靜態變量即時編譯器編譯後的代碼數據等(這個區域的內存回收目標主要是針對常量池的回收和對類型的卸載)。
GC(Garbage Collection):垃圾回收器。
Java的自動垃圾回收機制:簡單理解為,
程序員就不需要再手動的去控制內存的釋放。當JVM發覺內存資源緊張的時候,就會自動地去清理無用對象(沒有被引用到的對象)所占用的內存空間。

數組/面向對象再講.

方法參數的值傳遞機制

技術分享圖片

方法參數的值傳遞機制:值的傳遞(畫圖分析)
基本數據類型:實參值的副本的傳遞(棧)//改變值
例子:定義一個方法,改變值,然後在main中調用之後只是否改變
引用數據類型:地址值的副本的傳遞(棧、堆)//交換兩個數組中的元素的位置。
例子:{10,99}變為{99,10}
首先打印出定義的數組裏面的元素。(遍歷數組中的元素)
然後定義方法(引用第三方變量)進行交換
最後進行調用
方法參數的之傳遞機制

技術分享圖片

技術分享圖片

java基礎 方法