標籤:個數 小數 標識符 位置 地址 strong 副本 work png
方法的定義和調用
方法定義,方法(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發覺記憶體資源緊張的時候,就會自動地去清理無用對象(沒有被引用到的對象)所佔用的記憶體空間。數組/物件導向再講.
方法參數的值傳遞機制
方法參數的值傳遞機制:值的傳遞(畫圖分析)基礎資料型別 (Elementary Data Type):實參值的副本的傳遞(棧)//改變值例子:定義一個方法,改變值,然後在main中調用之後只是否改變引用資料類型:地址值的副本的傳遞(棧、堆)//交換兩個數組中的元素的位置。例子:{10,99}變為{99,10}首先列印出定義的數組裡面的元素。(遍曆數組中的元素)然後定義方法(引用第三方變數)進行交換最後進行調用方法參數的之傳遞機制
java基礎 方法