




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章方法2過程單元過程procedureGreetingsprocedureGreetings將需要重復(fù)使用的程序段或分解的子問題編寫為一個(gè)邏輯上獨(dú)立的過程??梢灾貜?fù)調(diào)用。Greetings?總共輸出多少個(gè)“hello”?6.1定義方法Java語言定義方法的語法結(jié)構(gòu)如下:不返回值,則類型為void符合標(biāo)識符命名規(guī)則,習(xí)慣上用小寫動詞數(shù)量、類型和順序語句集合若方法頭定義處為void類型,則可以不需要此句,也可以只使用return;方法頭(方法簽名)方法體方法Page.816.2調(diào)用方法1.方法調(diào)用表達(dá)式:有返回值方法的調(diào)用
將方法調(diào)用作為一個(gè)表達(dá)式或表達(dá)式的一部分。舉例:
intbig=max(10,100);//max方法調(diào)用的值被賦值給變量System.out.println(max(10,100));//max方法調(diào)用的值被輸出intsum=max(x,y)+200;//max方法調(diào)用的值參與算術(shù)運(yùn)算2.方法調(diào)用語句:無返回值方法(void方法)的調(diào)用例如:System.out.println("welcometojava");//調(diào)用void方法的語句
實(shí)參Page.826.2調(diào)用方法③方法調(diào)用的執(zhí)行流程一個(gè)方法中調(diào)用另一個(gè)方法時(shí),程序的流程從發(fā)生方法調(diào)用的位置離開轉(zhuǎn)移到被調(diào)用的方法,當(dāng)被調(diào)用方法中碰到return或執(zhí)行完最后一條語句時(shí),程序流程重新回到調(diào)用者方法繼續(xù)后面操作的執(zhí)行Page.82void方法的調(diào)用流程示例圖
6.3參數(shù)的值傳遞實(shí)參與形參在次序和數(shù)量上匹配,在數(shù)據(jù)類型上兼容。數(shù)據(jù)類型兼容是指實(shí)參與形參的數(shù)據(jù)類型相同,或者實(shí)參不必經(jīng)過強(qiáng)制類型轉(zhuǎn)換就可以將值賦給形參。實(shí)參向形參的傳遞數(shù)據(jù)是單向值傳遞。只能是實(shí)參將值傳遞給形參,在被調(diào)用方法的執(zhí)行過程中,無論形參的值發(fā)生怎樣變化都不會反過來影響實(shí)參的值。6.3參數(shù)的值傳遞舉例://文件名:ParameterPass.javapublicclassParamterPass{publicstaticvoidmain(String[]args){intx=10,y=100;System.out.printf("調(diào)用swap方法之前:x=%d,y=%d\n",x,y);swap(x,y);System.out.printf("調(diào)用swap方法之前:x=%d,y=%d\n",x,y);}publicstaticvoidswap(inta,intb){inttemp;System.out.println("\t在swap方法內(nèi):");System.out.printf("\t\t交換a,b之前:a=%d,b=%d\n",a,b);temp=a;a=b;b=temp;System.out.printf("\t\t交換a,b之后:a=%d,b=%d\n",a,b);}} 實(shí)參形參?先有形參,還是先有實(shí)參?運(yùn)行結(jié)果:從上圖所示的程序運(yùn)行結(jié)果中可以發(fā)現(xiàn),形參數(shù)值的變化對實(shí)參的數(shù)值沒有影響。6.6局部變量局部變量是在方法內(nèi)部定義的變量局部變量必須先定義后使用局部變量的作用域從變量的定義語句始,到包含該變量定義語句的最內(nèi)層的塊結(jié)束止。一個(gè)變量的作用域是程序中的某個(gè)范圍,在此范圍內(nèi)的語句可以使用該變量。形式參數(shù)是方法的局部變量作用域?yàn)檎麄€(gè)方法體。形式參數(shù),作用域?yàn)檎麄€(gè)aMethod方法Java語言允許在一個(gè)方法中兩個(gè)不存在嵌套關(guān)系的語句塊中定義同名局部變量,但是禁止在相互嵌套的兩個(gè)語句塊中定義同名局部變量。習(xí)題與實(shí)驗(yàn)書本作業(yè)復(fù)習(xí)題6.1,6.2,6.4,6.5編程練習(xí)6.6,6.7,6.8,6.10實(shí)驗(yàn)題目6001,6002,6004Java程序設(shè)計(jì)13Java程序設(shè)計(jì)14第8章再講方法重載、方法與數(shù)組方法的遞歸調(diào)用6.4方法重載方法重載一個(gè)類中可以有2個(gè)或多個(gè)同名方法,即相同的方法名稱使用不同的形式參數(shù)列表區(qū)分名稱相同的方法方法重載的調(diào)用過程首先判斷方法的實(shí)參和形參數(shù)量是否相同,若相同則:(1)若類型也完全相同,則調(diào)用該方法;(2)否則,若有1個(gè)通過自動類型類型轉(zhuǎn)換可以進(jìn)行參數(shù)傳遞,則調(diào)用該方法;(3)否則,若有多個(gè)通過自動類型類型轉(zhuǎn)換可以進(jìn)行參數(shù)傳遞的方法,且其中一個(gè)方法的形參與實(shí)參最接近,則調(diào)用該方法;(4)否則,若有多個(gè)需要通過自動類型類型轉(zhuǎn)換可以進(jìn)行參數(shù)傳遞的方法,但其中形參與實(shí)參最接近的方法多于1個(gè),則無法調(diào)用,編譯出錯(cuò)。//文件名:MethodOverloading.javapublicclassMethodOverloading{publicstaticvoidmain(String[]args){intx;doubley;
//參數(shù)完全匹配的調(diào)用
x=max(10,100);//調(diào)用max(int,int)y=max(1.0,2.0);//調(diào)用max(double,double)y=max(1.0,2.0,3.0);//調(diào)用max(double,double,double)
//需要進(jìn)行類型轉(zhuǎn)換的調(diào)用
y=max(1.0,100);//調(diào)用max(double,double)y=max(10,2.5);//調(diào)用max(double,double)y=max(1,2,3);//調(diào)用max(double,double,double)}max的方法定義//返回2個(gè)int數(shù)據(jù)的大值
publicstaticintmax(inta,intb){returna>b?a:b;}//返回2個(gè)double數(shù)據(jù)的大值
publicstaticdoublemax(doublea,doubleb){returna>b?a:b;}//返回3個(gè)double數(shù)據(jù)的大值
publicstaticdoublemax(doublea,doubleb,doublec){returnmax(max(a,b),c);}}小結(jié):方法重載方法重載可以使程序清晰易讀,并減少記憶方法名稱的難度。定義完成相似任務(wù)的方法時(shí)應(yīng)該使用重載給予相同的方法名和不同的形參列表。方法的返回值類型和修飾符不能作為重載方法時(shí)區(qū)別方法的依據(jù)。6.5方法與數(shù)組調(diào)用方法和被調(diào)用方法之間傳遞的參數(shù)為數(shù)組時(shí)本質(zhì)上,傳遞的是數(shù)組變量的值數(shù)組變量中存放的是數(shù)組地址因此參數(shù)傳遞和返回值都是數(shù)組的地址,而不是數(shù)組本身舉例:編寫方法通過形參接收一個(gè)int類型數(shù)組,并將數(shù)組的元素進(jìn)行逆序存放。問題需求分析:寫一個(gè)方法,接受int型數(shù)組作為參數(shù),在方法體中將數(shù)組元素逆序如:長度為n的整型數(shù)組list[n],逆序即意味著list[0]與list[n-1]的值互換,list[1]與lint[n-2]的值互換…..,直至到達(dá)中間數(shù),即i>=j(i從0起++,j從n-1起--)//文件名:ReverseArray.javapublicclassReverseArray{publicstaticvoidmain(String[]args){int[]list1={1,2,3,4,5,6,7,8,9,0};System.out.print("調(diào)用reversInSameArray前,list1:");outputArray(list1);reverseInSameArray(list1);System.out.print("調(diào)用reversInSameArray后,list1:");outputArray(list1);int[]list2={1,2,3,4,5,6,7,8,9,0};int[]list3=null;System.out.print("調(diào)用reverseInNewArray前,list2:");outputArray(list2);list3=reverseInNewArray(list2);System.out.print("調(diào)用reverseInNewArray后,list2:");outputArray(list2);System.out.print("調(diào)用reverseInNewArray后,list3:");outputArray(list3);}//輸出一個(gè)數(shù)組所有元素的方法,本方法沒有改變數(shù)組變量array的值,//也沒有改變數(shù)組的內(nèi)容
publicstaticvoidoutputArray(int[]array){for(intvalue:array){System.out.print(value+"");}System.out.println();}//在原數(shù)組中進(jìn)行元素逆序的方法,本方法沒有改變數(shù)組變量的值,但改變了數(shù)組的內(nèi)容
publicstaticvoidreverseInSameArray(int[]array){for(inti=0,j=array.length-1;i<j;i++,j--){inttemp=array[i];array[i]=array[j];array[j]=temp;}}//產(chǎn)生一個(gè)與原數(shù)組元素逆序的新數(shù)組,本方法改變了數(shù)組變量的值,//但沒有改變原數(shù)組的內(nèi)容
publicstaticint[]reverseInNewArray(int[]array){int[]old=array;array=newint[old.length];for(inti=0,j=array.length-1;i<old.length;i++,j--){array[i]=old[j];}returnarray;}}運(yùn)行結(jié)果:調(diào)用reverseInSameArray方法后,實(shí)參數(shù)組變量list1對應(yīng)的數(shù)組的內(nèi)容發(fā)生了變化,而調(diào)用reverseInNewArray方法后實(shí)參數(shù)組變量list2對應(yīng)的數(shù)組的內(nèi)容沒有發(fā)生變化。調(diào)用reverseInSameArray方法的過程如下圖所示:Ref:堆、棧程序中new操作在堆中分配存儲空間變量聲明在棧中分配存儲空間調(diào)用reverseInNewArray方法的過程如下圖所示:小結(jié):數(shù)組作為方法調(diào)用的參數(shù)和返回值傳遞的是數(shù)組的地址,而不是數(shù)組本身。被調(diào)用的方法中,形參修改數(shù)組內(nèi)容等價(jià)于實(shí)參訪問數(shù)組的修改。若對形參數(shù)組重新分配存儲空間,則該形參對數(shù)組內(nèi)容的操作將不會影響實(shí)參數(shù)組內(nèi)容。若在被調(diào)用的方法中創(chuàng)建一個(gè)新數(shù)組,該數(shù)組地址可以返回值形式傳給調(diào)用該方法的程序段返回值賦值給一個(gè)同類型的數(shù)組變量通過該數(shù)組變量,在調(diào)用方法中訪問被調(diào)用方法創(chuàng)建的數(shù)組6.6局部變量局部變量是在方法內(nèi)部定義的變量局部變量必須先定義后使用局部變量的作用域從變量的定義語句始,到包含該變量定義語句的最內(nèi)層的塊結(jié)束止。一個(gè)變量的作用域是程序中的某個(gè)范圍,在此范圍內(nèi)的語句可以使用該變量。形式參數(shù)是方法的局部變量作用域?yàn)檎麄€(gè)方法體。形式參數(shù),作用域?yàn)檎麄€(gè)aMethod方法Java語言允許在一個(gè)方法中兩個(gè)不存在嵌套關(guān)系的語句塊中定義同名局部變量,但是禁止在相互嵌套的兩個(gè)語句塊中定義同名局部變量。6.7方法的遞歸調(diào)用遞歸是一個(gè)數(shù)學(xué)概念,是指函數(shù)直接或間接的調(diào)用自己的過程,如階乘的定義。Java語言中方法的遞歸調(diào)用是指在方法體中直接或間接的調(diào)用方法自身。例6-5:編寫遞歸方法,對給定的正整數(shù)計(jì)算其階乘。n!=f(n)=n*f(n-1)n>0n!=1n=0//文件名:ComputeFactorial.javaimportjava.util.Scanner;publicclassComputeFactorial{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);longn=input.nextLong();longfac=factorial(n);System.out.println(n+"!="+fac);}publicstaticlongfactorial(longn){if(n==0){return1;}else{returnn*factorial(n-1);}}}遞歸方法的定義非常簡潔,遞歸調(diào)用過程相對復(fù)雜publicstaticlongfactorial(longn){if(n==0){return1;}else{returnn*factorial(n-1);}}遞歸方法在定義時(shí)需要滿足兩個(gè)條件:有一個(gè)或多個(gè)終止?fàn)顟B(tài),即最簡單的情況,用于結(jié)束遞歸調(diào)用。每次遞歸調(diào)用都必須簡化當(dāng)前問題的求解,使問題越來越接近終止?fàn)顟B(tài),最終達(dá)到終止?fàn)顟B(tài)。特別強(qiáng)調(diào),如果遞歸方法定義時(shí)沒有恰當(dāng)?shù)臐M足上面兩個(gè)條件,可能會造成無限遞歸,最終使內(nèi)存資源耗盡而中止程序。例6-6:編寫遞歸方法計(jì)算例4-7中Fibonacci數(shù)列中第n個(gè)數(shù)的值。fibonacci(1)=1;fibonacci(2)=1;fibonacci(n)=fibonacci(n-2)+fibonacci(n-1);n>2
//文件名:Fibonacci.javaimportjava.util.Scanner;publicclassFibonacci{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);longn=input.nextLong();System.out.println("fibonacci("+n+")="+
fibonacci(n));}publicstaticlongfibonacci(longn){if(n==1){return1;}elseif(n==2){return1;}else{returnfibonacci(n-1)+fibonacci(n-2);}}}例6-7:漢諾塔問題。這個(gè)問題目標(biāo)是把若干個(gè)大小互不相同的盤子從一個(gè)柱子移動到另一個(gè)柱子,移動時(shí)遵循的規(guī)則:有n個(gè)編號從1到n的盤子,三個(gè)命名為A、B、C的柱子;任何時(shí)候只能把較小的盤子放在較大的盤子上面;開始時(shí)所有盤子都在A柱上面;每次只能移動柱子最上面的一個(gè)盤子。目標(biāo)是將所有的盤子借助C柱從A柱移到B柱。要求輸出移動盤子的過程。10.2.1漢諾(Hanoi)塔問題解析
將64個(gè)盤從座A搬到座B(1)一次只能搬一個(gè)盤子(2)盤子只能插在A、B、C三個(gè)桿中(3)大盤不能壓在小盤上
A B C分析
A B C
A B Cnn-1n-110.2.1漢諾(Hanoi)塔問題解析遞歸方法的兩個(gè)要點(diǎn)(1)遞歸出口:一個(gè)盤子的解決方法;(2)遞歸式子:如何把搬動64個(gè)盤子的問題簡化成搬動63個(gè)盤子的問題。把漢諾塔的遞歸解法歸納成三個(gè)步驟:n-1個(gè)盤子從座A搬到座C第n號盤子從座A搬到座Bn-1個(gè)盤子從座C搬到座B算法:hanio(n個(gè)盤,A→B,C為過渡){if(n==1)
直接把盤子A→Belse{hanio(n-1個(gè)盤,A→C,B為過渡)
把第n號盤A→B
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車美容師技術(shù)轉(zhuǎn)型分析試題及答案
- 汽車維修工考試中新技能的掌握與應(yīng)用試題及答案
- 普通人的創(chuàng)業(yè)成功事跡
- 車輛安全性能的評估標(biāo)準(zhǔn)與方法考試試題及答案
- 寵物營養(yǎng)師職業(yè)道德規(guī)范考題及答案
- 11網(wǎng)絡(luò)管理技術(shù)
- 漢語言文學(xué)構(gòu)成重要元素試題及答案
- 2024-2025學(xué)年湖北省隨州市高一下學(xué)期2月聯(lián)考數(shù)學(xué)試題及答案
- 公務(wù)員省考與汽車維修工相關(guān)試題及答案
- 汽車車載網(wǎng)絡(luò)系統(tǒng)解析試題及答案
- 毛中特第一章毛澤東思想及其歷史地位課件
- 國際貿(mào)易理論與實(shí)務(wù)(天津財(cái)經(jīng)大學(xué))知到章節(jié)答案智慧樹2023年
- 教學(xué)防滅火新技術(shù) 公開課比賽一等獎(jiǎng)
- 四年級數(shù)學(xué)下冊教案(先學(xué)后教當(dāng)堂訓(xùn)練)
- 改革開放與新時(shí)代智慧樹知到答案章節(jié)測試2023年同濟(jì)大學(xué)
- 敦煌的藝術(shù)智慧樹知到答案章節(jié)測試2023年
- 淺談心理學(xué)在促進(jìn)社會工作服務(wù)質(zhì)量中的作用
- JJG 913-2015浮標(biāo)式氧氣吸入器
- GB/Z 20308-2006產(chǎn)品幾何技術(shù)規(guī)范(GPS)總體規(guī)劃
- 2023年沈陽職業(yè)技術(shù)學(xué)院高職單招(數(shù)學(xué))試題庫含答案解析
- GB/T 28731-2012固體生物質(zhì)燃料工業(yè)分析方法
評論
0/150
提交評論