面向對象-教案(第9講) 方法設計;(第10講)靜態變量與靜態方法_第1頁
面向對象-教案(第9講) 方法設計;(第10講)靜態變量與靜態方法_第2頁
面向對象-教案(第9講) 方法設計;(第10講)靜態變量與靜態方法_第3頁
面向對象-教案(第9講) 方法設計;(第10講)靜態變量與靜態方法_第4頁
面向對象-教案(第9講) 方法設計;(第10講)靜態變量與靜態方法_第5頁
已閱讀5頁,還剩6頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

《面向對象程序設計》教案第9講教學對象計算機科學技術專業授課內容4.5方法設計4.6案例學習——分數類Fraction的設計課程標準教學目標(一)知識目標1.掌握方法設計、參數傳遞2.學會方法重載(二)能力目標1.能夠熟練的定義方法實現代碼的模塊化2.能夠根據需要正確使用方法重載教學方法課前預習、課堂講授、課堂和課后練習。學時及分配(第1學時50分鐘)課堂講授30分鐘課堂練習20分鐘4.5.1如何設計方法4.5.2方法的調用4.5.3方法重載學時及分配(第2學時50分鐘)課堂講授30分鐘課堂練習20分鐘4.5.4方法的參數傳遞4.6案例學習——分數類Fraction的設計知識點分析重點:方法設計調用方法難點:方法參數傳遞方法重載教學過程設計內容方式問題導入在Java程序中,方法是類為用戶提供的接口,用戶使用方法操作對象。前面介紹了方法聲明的格式,本節將學習如何設計方法、方法的重載、方法的參數傳遞等。內容要點4.5方法設計4.5.1如何設計方法設計方法包括方法的返回值、參數以及方法的實現等。下面重新設計了Account類中定義的withdraw()方法,這里考慮了取款時賬戶余額不足的問題,如圖4-9所示。1.方法頭和方法簽名方法頭是指方法的修飾符、返回值類型、方法名和方法的參數。這里的參數是形式參數(parameter),調用方法時指定的參數為實際參數(actualparameter)。在一個類中可定義多個方法,我們通過方法簽名來區分這些方法。方法簽名(signature)是指方法名、參數個數、參數類型和參數順序的組合。注意,方法簽名的定義不包括方法的返回值。方法簽名將用在方法重載、方法覆蓋和構造方法中。2.方法返回值方法的返回值是方法調用結束后返回給調用者的數據。很多方法需要返回一個數據,這時要指定方法返回值,具體是在聲明方法時要指定返回值類型。有返回值的方法需要使用return語句將值返回給調用者,它的一般格式是:returnexpression;這里,expression是返回值的表達式,當調用該方法時,該表達式的值返回給調用者。例如,computeSalary()方法需返回總工資值,它的return語句如下:returntotalSalary;如果方法調用結束后不要求給調用者返回數據,則方法沒有返回值,此時返回值類型用void表示,在方法體中可以使用return語句表示返回void,格式如下:return;注意,這里沒有返回值,它僅表示將控制轉回到調用處。3.方法參數方法可以沒有參數,也可以有參數。沒有參數的方法在定義時只需一對括號。例如,Employee類的sayHello()方法沒有參數。有參數的方法在定義時要指定參數的類型和名稱,指定的參數稱為形式參數。例如Employee類computeSalary()方法帶兩個參數,一個是int型,一個是double型。對帶參數的方法,在調用方法時要為其傳遞實際參數。方法的參數類型可以是基本類型,也可以是引用類型。4.方法體方法聲明的后面是一對花括號,花括號內部是方法體。方法體是對方法的實現,它包括局部變量的聲明和所有合法的Java語句。方法的實現是在方法體中通過編寫有關的代碼,實現方法所需要的功能。例如,在Employee類的computeSalary()方法是要計算員工的工資,因此通過有關公式計算得到結果,然后將其返回。方法體中可以包含多條語句。computeSalary()方法就包含如下3條語句。doubletotalSalary;totalSalary=salary+hours*rate;returntotalSalary;5.訪問方法和修改方法一般地,把能夠返回成員變量值的方法稱為訪問方法(accessormethod),把能夠修改成員變量值的方法稱為修改方法(mutatormethod)。訪問方法名一般為getXxx(),因此,訪問方法也稱getter方法。修改方法名一般為setXxx(),因此,修改方法也稱setter方法。訪問方法的返回值一般與原來的變量值類型相同,而修改方法的返回值為void。例如,在Employee類中可以定義下面兩個方法:name成員的修改方法publicvoidsetName(Stringname){name成員的修改方法=name;}name成員的訪問方法publicStringgetName(){name成員的訪問方法returnname;}這兩個方法就分別是name成員的修改方法和訪問方法。4.5.2方法的調用調用方法就是要執行方法中的代碼,使用點號(.)運算符調用方法。一般來說,調用類的實例方法應先創建一個對象,然后通過對象引用調用,例如:AccountmyAccount=newAccount();myAccount.deposit(3000.00);如果要調用類的靜態方法,通常使用類名調用,例如:doublerand=Math.random();//返回一個隨機浮點數在調用沒有參數的方法時,只使用圓括號即可,對于有參數的方法需要提供實際參數。關于方法參數的傳遞將在4.5.4節討論。方法調用主要使用在三種場合:(1)用對象引用調用類的實例方法。(2)類中的方法調用本類中的其他方法。(3)用類名直接調用static方法。4.5.3方法重載Java語言提供了方法重載的機制,它允許在一個類中定義多個同名的方法,這稱為方法重載(methodoverloading)。實現方法重載,要求同名的方法要么參數個數不同,要么參數類型不同,僅返回值不同不能區分重載的方法。方法重載就是在類中允許定義簽名不同的方法。【案例4-6】在類中定義多個重載的方法。這里,在OverloadDemo類中定義了4個重載的display()方法。定義了重載方法后,對重載方法的調用與一般方法的調用相同?!境绦?-6】OverloadDemo.java4.5.4方法參數的傳遞對帶參數的方法,調用方法時需要向它傳遞參數。在Java語言中,方法的參數傳遞是按值傳遞(passbyvalue),即在調用方法時將實際參數的值的一個拷貝傳遞給方法中的形式參數,方法調用結束后實際參數的值并不改變。形式參數是局部變量,其作用域只在方法內部,離開方法后自動釋放。盡管參數傳遞是按值傳遞的,但對于基本數據類型的參數和引用數據類型的參數的傳遞還是不同的。對于基本數據類型的參數,是將實際參數值的一個拷貝傳遞給方法,方法調用結束后,對原來的值沒有影響。當參數是引用類型時,實際傳遞的是引用值,因此在方法的內部有可能改變原來的對象?!景咐?-7】兩種參數傳遞,按值傳遞和按引用傳遞?!境绦?-7】PassByValue.java4.6案例學習:分數類Fraction的設計1.問題描述分數(fraction),也稱為有理數(rationalnumber),是兩個整數的比值,如3/4、1/2和7/5等。Java語言沒有定義表示分數的類型,但我們可以定義一個類,通過指定兩個整型成員實現一個分數類,并且定義分數的運算(操作)方法。這兩個成員一個是numer,表示分子(numerator),一個是denom,表示分母(denominator)。定義一個類,我們通常還需要考慮各種約束條件,比如對于分數有如下三個條件:分母不能為0。類似于2/0的分數沒有定義。分數的符號由分子符號和分母符號共同決定,并且應設置為分子的符號。分子和分母不應該具有公因數。例如,6/9應該化簡為2/3。下圖給出了分數類Fraction的UML圖,該類包含兩個int型成員numer和denom,分別表示分子和分母,定義該類的構造方法以及成員的getter和setter方法。定義該類的化簡方法,如分數4/8應該化簡為1/2。定義該類的toString()方法,輸出化簡后的結果(如果是整數,只輸出整數)。編寫實例方法和類方法實現分數的加、減、乘、除運算。FractionFraction-numer:int-denom:int+Fraction()+Fraction(numer:int)+Fraction(numer:int,denomint)+getNumer():int+geDenom():int+add(Fractionfr):Fraction+subtract(Fractionfr):Fraction+multiply(Fractionfr):Fraction+divide(Fractionfr):Fraction-gcd():int+normalize():void+toString():String分子分母默認構造方法,創建0/1分數創建分母是1,分子是numer的分數創建給定分子和分母的分數返回分數的分子返回分數的分母分數對象與分數對象相加分數對象與分數對象相減分數對象與分數對象相乘分數對象與分數對象相除返回分子和分母的最大公約數規范化方法,實現約束條件以numer/denom的形式返回分數圖4-9Fraction類的UML圖2.設計思路根據給定分數的運算公式和UML類圖的要求,按照下列步驟設計分數類。(1)為Fraction類定義兩個private成員變量numer和denom,分別表示分數的分子和分母。(2)為Fraction類定義三個構造方法,默認構造方法、帶一個int型參數numer的構造方法和帶分子numer和分母denom的構造方法。(3)為兩個成員變量定義訪問方法getNumer和getDenom方法,分別用于訪問分數的分子和分母。不定義修改方法,表示分數對象創建后用戶不能修改。(4)定義add、subtract、multiply、divide方法,實現當前分數對象和參數分數對象的運算。gcd()方法用于返回分子和分母的最大公約數。normalize()方法用于對分數對象規范化,也就是實現約束條件。(5)覆蓋toString方法,該方法是Object類中定義的方法。它根據分數的不同情況構建分數的輸出格式。3.代碼實現【程序4-8】Fraction類是分數的實現類【程序4-9】FractionDemo類是分數的測試類?!揪幊萄菥殹慷xCalculator類表示計算器。該類有兩個double型成員a和b,為該類定義加(add)、減(minus)、乘(multiply)、除(divide)四個方法,它們均返回執行兩個成員各種運算的結果。Calculator類的UML如圖所示。 采用機房授課,講練結合,同時用啟發式、討論式、案例教學等教學方法。布置課外學習任務定義Rectangle類表示矩形,其中含有length、width兩個double型的成員變量表示矩形的長和寬。要求為每個變量定義訪問方法和修改方法,定義求矩形周長的方法getPerimeter()和求面積的方法getArea()。定義一個帶參數構造方法,通過給出的長和寬創建矩形對象。定義默認構造方法,在該方法中調用有參數構造方法,將矩形長寬都設置為1.0。畫出該類的UML圖。編寫程序測試這個矩形類的所有方法。定義一個名為Account的類實現賬戶管理,它的UML圖如圖4-16所示。編寫一個應用程序測試Account類的使用。AccountAccount-id:int-balance:double-annulRate:double-dateCreated:LocalDate+Account()+Account(id:int,balance:double)+getId():int+setId(intid):void+getBalance():double+setBalance(doublebalance):void+getAnnualRate():double+setAnnualRate(annualRate:double):void+getDateCreated():LocalDate+getMonthlyInterestRate():double+withdraw(amount:double):void+deposit(amount:double):void賬戶的id賬戶的余額存款的年利率開戶日期默認構造方法帶參數構造方法返回id的方法修改id的方法返回balance的方法修改balance的方法返回annualInterestRate的方法修改annualInterestRate的方法返回賬戶創建日期的方法返回月利率的方法取款的方法存款的方法圖4-16Account類的UML圖教學反思《面向對象程序設計》教案第10講教學對象計算機科學技術專業授課內容4.7靜態變量與靜態方法4.8遞歸4.9案例學習課程標準教學目標(一)知識目標1.重點掌握靜態成員的定義和使用2.掌握方法的遞歸調用(二)能力目標1.能夠應用類、對象、封裝、繼承、多態等知識編寫應用程序。2.能夠掌握面向對象理論與方法,進行創新性的編程設計教學方法課前預習、課堂講授、課堂和課后練習。學時及分配(第1學時50分鐘)課堂講授30分鐘課堂練習20分鐘4.7.1靜態變量4.7.2靜態方法4.8遞歸學時及分配(第2學時50分鐘)課堂講授30分鐘課堂練習20分鐘4.9案例學習課堂演練知識點分析重點:靜態成員的定義和使用。方法的遞歸調用難點:方法的遞歸調用教學過程設計內容方式問題導入前面學習了實例變量和實例方法的定義和使用,這節來學習靜態變量和靜態方法的使用。另外還將學習方法的遞歸調用以及對象初始化等內容。內容要點4.7靜態變量和靜態方法如果成員變量用static修飾,則該變量稱為靜態變量或類變量(classvariable),否則稱為實例變量(instancevariable)。如果成員方法用static修飾,則該方法稱為靜態方法或類方法(classmethod),否則稱為實例方法(instancemethod)。4.7.1靜態變量實例變量和靜態變量的區別是:在創建類的對象時,Java運行時系統為每個對象的實例變量分配一塊內存,然后通過該對象來訪問該實例變量。不同對象的實例變量占用不同的存儲空間,因此它們是不同的。而對于靜態變量,Java運行時系統在類裝載時為這個類的每個靜態變量分配一塊內存,以后再生成該類的對象時,這些對象將共享同名的靜態變量,每個對象對靜態變量的改變都會影響到其他對象?!境绦?-10】類的實例變量和靜態變量區別。Counter類定義了一個實例變量x和一個靜態變量y。Counter.javapackagecom.boda.xy;publicclassCounter{publicintx;//實例變量publicstaticinty=0;//靜態變量publicCounter(){x=100;}}對于靜態變量通常使用類名訪問,如下所示:Counter.y=100;Counter.y=200;System.out.println(Counter.y);//輸出200可以通過實例名訪問靜態變量,但這種方法可能產生混亂的代碼,不推薦通過實例訪問靜態變量。Countera=newCounter();Counterb=newCounter();a.y=100;b.y=200;System.out.println(a.y);//輸出結果為200上述語句執行后的效果如圖4-14所示。a和b兩個對象共享一個y存儲空間。4.7.2靜態方法靜態方法和實例方法的區別是:靜態方法屬于類,它只能訪問靜態變量。實例方法可以對當前的實例變量進行操作,也可以對靜態變量進行操作。靜態方法通常用類名調用,也可以用實例變量調用,實例方法必須由實例來調用。注意,在靜態方法中不能使用this和super關鍵字?!境绦?-11】類的靜態方法。靜態方法屬于類,可以訪問類的靜態成員,但不能方法實例成員。SomeClass.javapackagecom.boda.xy;publicclassSomeClass{intx=5;staticinty=48;//靜態方法的定義publicstaticvoiddisplay(){可以訪問靜態變量y=y+100;可以訪問靜態變量System.out.println("y="+y);編譯錯誤,不能訪問實例成員x=x*5;編譯錯誤,不能訪問實例成員System.out.println("x="+x);}}關于類的靜態成員和實例成員總結如下:實例方法可以調用實例方法和靜態方法,以及訪問實例變量和靜態變量。靜態方法可以調用靜態方法以及訪問靜態變量。靜態方法不能調用實例方法或訪問實例變量,因為靜態方法和靜態變量不屬于某個特定對象。靜態成員和實例成員的關系如圖4-16所示。4.8方法遞歸調用遞歸(recursion)是解決復雜問題的一種常見方法。其基本思想就是把問題逐漸簡單化,最后實現問題的求解。例如,求正整數n的階乘n!,就可以通過遞歸實現。n!可按遞歸定義如下:0!=1;n!=n×(n-1)!;n>0Java語言支持方法的遞歸調用。所謂方法的遞歸調用就是方法自己調用自己。設計算n!的方法為factor(n),則該算法的簡單描述如下:if(n==0)return1;elsereturnfactor(n-1)*n;【程序4-12】用遞歸方法計算整數的階乘RecursionDemo.javapackagecom.boda.xy;publicclassRecursionDemo{publicstaticlongfactor(intn){計算n階乘的遞歸方法if(n==0)計算n階乘的遞歸方法 return1;else調用方法自己,但參數不同 returnn*factor(n-1);調用方法自己,但參數不同}publicstaticvoidmain(String[]args){intk=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論