Java程序設(shè)計:6 方法_第1頁
Java程序設(shè)計:6 方法_第2頁
Java程序設(shè)計:6 方法_第3頁
Java程序設(shè)計:6 方法_第4頁
Java程序設(shè)計:6 方法_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第6章方法2過程單元過程procedureGreetingsprocedureGreetings將需要重復(fù)使用的程序段或分解的子問題編寫為一個邏輯上獨立的過程??梢灾貜?fù)調(diào)用。Greetings?總共輸出多少個“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)用作為一個表達(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ù)運算2.方法調(diào)用語句:無返回值方法(void方法)的調(diào)用例如:System.out.println("welcometojava");//調(diào)用void方法的語句

實參Page.826.2調(diào)用方法③方法調(diào)用的執(zhí)行流程一個方法中調(diào)用另一個方法時,程序的流程從發(fā)生方法調(diào)用的位置離開轉(zhuǎn)移到被調(diào)用的方法,當(dāng)被調(diào)用方法中碰到return或執(zhí)行完最后一條語句時,程序流程重新回到調(diào)用者方法繼續(xù)后面操作的執(zhí)行Page.82void方法的調(diào)用流程示例圖

6.3參數(shù)的值傳遞實參與形參在次序和數(shù)量上匹配,在數(shù)據(jù)類型上兼容。數(shù)據(jù)類型兼容是指實參與形參的數(shù)據(jù)類型相同,或者實參不必經(jīng)過強制類型轉(zhuǎn)換就可以將值賦給形參。實參向形參的傳遞數(shù)據(jù)是單向值傳遞。只能是實參將值傳遞給形參,在被調(diào)用方法的執(zhí)行過程中,無論形參的值發(fā)生怎樣變化都不會反過來影響實參的值。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);}} 實參形參?先有形參,還是先有實參?運行結(jié)果:從上圖所示的程序運行結(jié)果中可以發(fā)現(xiàn),形參數(shù)值的變化對實參的數(shù)值沒有影響。6.6局部變量局部變量是在方法內(nèi)部定義的變量局部變量必須先定義后使用局部變量的作用域從變量的定義語句始,到包含該變量定義語句的最內(nèi)層的塊結(jié)束止。一個變量的作用域是程序中的某個范圍,在此范圍內(nèi)的語句可以使用該變量。形式參數(shù)是方法的局部變量作用域為整個方法體。形式參數(shù),作用域為整個aMethod方法Java語言允許在一個方法中兩個不存在嵌套關(guān)系的語句塊中定義同名局部變量,但是禁止在相互嵌套的兩個語句塊中定義同名局部變量。習(xí)題與實驗書本作業(yè)復(fù)習(xí)題6.1,6.2,6.4,6.5編程練習(xí)6.6,6.7,6.8,6.10實驗題目6001,6002,6004Java程序設(shè)計13Java程序設(shè)計14第8章再講方法重載、方法與數(shù)組方法的遞歸調(diào)用6.4方法重載方法重載一個類中可以有2個或多個同名方法,即相同的方法名稱使用不同的形式參數(shù)列表區(qū)分名稱相同的方法方法重載的調(diào)用過程首先判斷方法的實參和形參數(shù)量是否相同,若相同則:(1)若類型也完全相同,則調(diào)用該方法;(2)否則,若有1個通過自動類型類型轉(zhuǎn)換可以進(jìn)行參數(shù)傳遞,則調(diào)用該方法;(3)否則,若有多個通過自動類型類型轉(zhuǎn)換可以進(jìn)行參數(shù)傳遞的方法,且其中一個方法的形參與實參最接近,則調(diào)用該方法;(4)否則,若有多個需要通過自動類型類型轉(zhuǎn)換可以進(jìn)行參數(shù)傳遞的方法,但其中形參與實參最接近的方法多于1個,則無法調(diào)用,編譯出錯。//文件名: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個int數(shù)據(jù)的大值

publicstaticintmax(inta,intb){returna>b?a:b;}//返回2個double數(shù)據(jù)的大值

publicstaticdoublemax(doublea,doubleb){returna>b?a:b;}//返回3個double數(shù)據(jù)的大值

publicstaticdoublemax(doublea,doubleb,doublec){returnmax(max(a,b),c);}}小結(jié):方法重載方法重載可以使程序清晰易讀,并減少記憶方法名稱的難度。定義完成相似任務(wù)的方法時應(yīng)該使用重載給予相同的方法名和不同的形參列表。方法的返回值類型和修飾符不能作為重載方法時區(qū)別方法的依據(jù)。6.5方法與數(shù)組調(diào)用方法和被調(diào)用方法之間傳遞的參數(shù)為數(shù)組時本質(zhì)上,傳遞的是數(shù)組變量的值數(shù)組變量中存放的是數(shù)組地址因此參數(shù)傳遞和返回值都是數(shù)組的地址,而不是數(shù)組本身舉例:編寫方法通過形參接收一個int類型數(shù)組,并將數(shù)組的元素進(jìn)行逆序存放。問題需求分析:寫一個方法,接受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);}//輸出一個數(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)生一個與原數(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;}}運行結(jié)果:調(diào)用reverseInSameArray方法后,實參數(shù)組變量list1對應(yīng)的數(shù)組的內(nèi)容發(fā)生了變化,而調(diào)用reverseInNewArray方法后實參數(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)容等價于實參訪問數(shù)組的修改。若對形參數(shù)組重新分配存儲空間,則該形參對數(shù)組內(nèi)容的操作將不會影響實參數(shù)組內(nèi)容。若在被調(diào)用的方法中創(chuàng)建一個新數(shù)組,該數(shù)組地址可以返回值形式傳給調(diào)用該方法的程序段返回值賦值給一個同類型的數(shù)組變量通過該數(shù)組變量,在調(diào)用方法中訪問被調(diào)用方法創(chuàng)建的數(shù)組6.6局部變量局部變量是在方法內(nèi)部定義的變量局部變量必須先定義后使用局部變量的作用域從變量的定義語句始,到包含該變量定義語句的最內(nèi)層的塊結(jié)束止。一個變量的作用域是程序中的某個范圍,在此范圍內(nèi)的語句可以使用該變量。形式參數(shù)是方法的局部變量作用域為整個方法體。形式參數(shù),作用域為整個aMethod方法Java語言允許在一個方法中兩個不存在嵌套關(guān)系的語句塊中定義同名局部變量,但是禁止在相互嵌套的兩個語句塊中定義同名局部變量。6.7方法的遞歸調(diào)用遞歸是一個數(shù)學(xué)概念,是指函數(shù)直接或間接的調(diào)用自己的過程,如階乘的定義。Java語言中方法的遞歸調(diào)用是指在方法體中直接或間接的調(diào)用方法自身。例6-5:編寫遞歸方法,對給定的正整數(shù)計算其階乘。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);}}遞歸方法在定義時需要滿足兩個條件:有一個或多個終止?fàn)顟B(tài),即最簡單的情況,用于結(jié)束遞歸調(diào)用。每次遞歸調(diào)用都必須簡化當(dāng)前問題的求解,使問題越來越接近終止?fàn)顟B(tài),最終達(dá)到終止?fàn)顟B(tài)。特別強調(diào),如果遞歸方法定義時沒有恰當(dāng)?shù)臐M足上面兩個條件,可能會造成無限遞歸,最終使內(nèi)存資源耗盡而中止程序。例6-6:編寫遞歸方法計算例4-7中Fibonacci數(shù)列中第n個數(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:漢諾塔問題。這個問題目標(biāo)是把若干個大小互不相同的盤子從一個柱子移動到另一個柱子,移動時遵循的規(guī)則:有n個編號從1到n的盤子,三個命名為A、B、C的柱子;任何時候只能把較小的盤子放在較大的盤子上面;開始時所有盤子都在A柱上面;每次只能移動柱子最上面的一個盤子。目標(biāo)是將所有的盤子借助C柱從A柱移到B柱。要求輸出移動盤子的過程。10.2.1漢諾(Hanoi)塔問題解析

將64個盤從座A搬到座B(1)一次只能搬一個盤子(2)盤子只能插在A、B、C三個桿中(3)大盤不能壓在小盤上

A B C分析

A B C

A B Cnn-1n-110.2.1漢諾(Hanoi)塔問題解析遞歸方法的兩個要點(1)遞歸出口:一個盤子的解決方法;(2)遞歸式子:如何把搬動64個盤子的問題簡化成搬動63個盤子的問題。把漢諾塔的遞歸解法歸納成三個步驟:n-1個盤子從座A搬到座C第n號盤子從座A搬到座Bn-1個盤子從座C搬到座B算法:hanio(n個盤,A→B,C為過渡){if(n==1)

直接把盤子A→Belse{hanio(n-1個盤,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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論