java基礎 方法
阿新 • • 發佈:2018-01-14
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基礎 方法