第八章方法函数

上传人:M****1 文档编号:585165466 上传时间:2024-09-01 格式:PPT 页数:38 大小:839.03KB
返回 下载 相关 举报
第八章方法函数_第1页
第1页 / 共38页
第八章方法函数_第2页
第2页 / 共38页
第八章方法函数_第3页
第3页 / 共38页
第八章方法函数_第4页
第4页 / 共38页
第八章方法函数_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《第八章方法函数》由会员分享,可在线阅读,更多相关《第八章方法函数(38页珍藏版)》请在金锄头文库上搜索。

1、第八章第八章 方法方法(函数)函数)8.1 8.1 方法声明方法声明8.2 8.2 方法调用方法调用8.3 8.3 参数传递参数传递8.4 8.4 递归递归 概念概念v 方法方法(Method)(Method) 这是Java的一种命名 和通常意义上的“方法”不同v Java Java “方法方法”的定义的定义完成特定功能的、相对独立的程序段v 特点特点 方法可以在不同的程序段中被多次调用 可增强程序结构的清晰度,提高编程效率v 学习重点学习重点方法的声明和调用一个例子一个例子v数学计算数学计算Y=(1,2,100)+(200,201,298)+(-1,-2-99)+(51,52,199)vHo

2、w to do?1.在程序中使用4个循环第第一一种种做做法法publicclassChap4DemoMathod1publicstaticvoidmain(Stringargs)intf=0;for(inti=1;i=100;i+)/(1,2,3,4100)f=f+i;for(inti=200;i=298;i+)/(200,201,298)f=f+i;for(inti=-99;i=-1;i+)/+(-1,-2-99)f=f+i;for(inti=51;i=199;i+)/+(51,52,199)f=f+i;System.out.printf(TheRusult:,f);TheResult:43

3、375第第二二种种做做法法publicclassChap4DemoMathod2staticintfunc(intn,intm)/定义Java方法intsum=0;for(;nb)min=b;for(inti=min;i0;i-)if(a%i=0&b%i=0)g=i;break; returng;Prog1.javaDemoDemo【例例8-68-6】判别一个数是否为素数判别一个数是否为素数。解题:用该数解题:用该数a a对对i i求余(求余(i i为小于为小于a a的平方根的整数),如果结果的平方根的整数),如果结果不为不为0 0,则将,则将i-1,i-1,继续求余数。如果出现一个能被继续求

4、余数。如果出现一个能被a a整除的数,整除的数,该数不是素数。该数不是素数。publicstaticbooleanPrime(intq)booleang=true;if(q=0|q=1|q1;i-)if(q%i=0)g=false;break;returng;Prog2.java8.3 8.3 参数传递参数传递v 参数传递规则参数传递规则调用带形参的“方法”时,必须提供实参实参形参,称为参数传递被调用的“方法”用实参执行方法体8.3 8.3 参数传递参数传递v在在Java中,对于基本数据类型,参数按值传递中,对于基本数据类型,参数按值传递参数以值的方式进行传递,即调用时将实参的值传递给“方法”

5、的形参。基本类型作为参数传递时,是传递值的拷贝,基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的无论你怎么改变这个拷贝,原值是不会改变的。?问题:如果形参变了,实参变吗?问题:如果形参变了,实参变吗?答案:答案:基本类型和基本类型变量被当作参数传递给方法时,是值基本类型和基本类型变量被当作参数传递给方法时,是值传递。在方法实体中,无法给原变量重新赋值,也无法改变它传递。在方法实体中,无法给原变量重新赋值,也无法改变它的值。的值。即即实参不变。实参不变。参数按数值传递的例子参数按数值传递的例子v【例例8-7】public class Chap45Swap stat

6、ic void swap(int x, int y) System.out.println(交换前:交换前:x=+x+ y=+y);int temp = x; x = y; y = temp; / 交换交换System.out.println(交换后:交换后:x=+x+ y=+ y);public static void main(String args) int a = 23, b = 10;System.out.println(调用前:调用前:a=+a+ b=+b);swap(a, b); / 调用调用“方法方法”System.out.println(调用后:调用后:a=+a+ b=+b)

7、;Chap45Swap.java数值传递的例子数值传递的例子v【例例8-7】运行的结果运行的结果调用前:a=23b=10交换前:x=23y=10交换后:x=10y=23调用后:a=23b=10v说明:说明:参数传递:ax;by交换前后:x、y的值改变了调用前后:a、b的值没有变static void swap(int x, int y) int temp = x; x = y; y = temp; / 交换交换public static void main(String args) int a = 23, b = 10; swap(a, b); / 调用调用“方法方法”按值传递按值传递, ,形

8、参的改变对实形参的改变对实参没有影响参没有影响, ,即实参不变即实参不变8.3 8.3 参数传递参数传递v在在Java中,对于数组类型和对象引用类型,参数按中,对于数组类型和对象引用类型,参数按引用传递引用传递v参数以引用的方式进行传递,即调用时将参数以引用的方式进行传递,即调用时将实参的引用实参的引用传递给形参。传递给形参。v1)对于引用类型,在方法体内对对于引用类型,在方法体内对形式形式参数参数(引用)(引用)进行重新进行重新赋值赋值,并不会改变,并不会改变实际参数持有的实际参数持有的引用。引用。2)但但方法体内对方法体内对形式形式参数参数(引用)(引用)所指向对象的属所指向对象的属性进行

9、运算,将改变原有性进行运算,将改变原有实际参数实际参数所指向对象的属性所指向对象的属性值。值。引用传递的例子(数组做引用传递的例子(数组做参数)参数)v【例例8-8】 prog6.javavpublic class prog6 vpublic static void main(String args) inta=34,5,24,8,56,99,100;System.out.println(排序前);for(inti=0;ia.length;i+)System.out.print(ai+ ); bubbleSort(a);System.out.println();System.out.print

10、ln(排序后);for(inti=0;ia.length;i+)System.out.print(ai+ );v vstatic void bubbleSort(int data ).static void bubbleSort(int data )for(int i=1;i=data.length-1;i+)for(int j=1;jdataj)int temp;temp=dataj-1;dataj-1=dataj;dataj=temp;按引用传递按引用传递, ,形参的改变形参的改变 影响实参影响实参【例8-9】TestBox.java假设有一个盒子类BOXclass BoxStringco

11、lor;Box(Stringcolor) this.color= color; public String toString()return color;public class TestBoxstatic void changeColor(Box b1)b1.color=green;public static void main(String args)BoxredBox=new Box(red);System.out.println(红盒子是红盒子是 +redBox.color+色的。色的。);changeColor(redBox);System.out.println(红盒子是红盒子是

12、+redBox.color+色的。色的。);/调用了changeColor方法后,盒子的属性color被改变。引用传递的例子(对象的引用做参数)引用传递的例子(对象的引用做参数)对象对象的引用的引用作为参数传递作为参数传递的例子publicclassyinyong1publicstaticvoidmain(Stringargs)StringBufferstr=newStringBuffer(Hello);System.out.println(Beforechange,str=+str);changeData(str);System.out.println(AfterchangeData(n),

13、str=+str);publicstaticvoidchangeData(StringBufferstrBuf)strBuf.append(World!);先看输出结果:Beforechange,str=HelloAfterchangeData(n),str=HelloWorld!从结果来看,str的值被改变了,那么是不是可以说:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。引用传递的例子(对象的引用做参数)引用传递的例子(对象的引用做参数)yinyong1.java我们对上面的例子稍加改动一下publicclassyinyong2publicst

14、aticvoidmain(Stringargs)StringBufferstr=newStringBuffer(Hello);System.out.println(Beforechange,str=+str);changeData(str);System.out.println(AfterchangeData(n),str=+str);publicstaticvoidchangeData(StringBufferstrBuf)strBuf=newStringBuffer(Hi);strBuf.append(World!);运行一下这个程序,你会发现结果是这样的:Beforechange,str

15、=HelloAfterchangeData(n),str=Hello引用传递的例子(对象的引用做参数)引用传递的例子(对象的引用做参数)yinyong2.java先看Test2这个程序:StringBufferstr=newStringBuffer(Hello);这一句执行完后,就会在内存的堆里生成一个str对象,请看图1:如图1所示,str是一个引用,里面存放的是一个地址“3a”(这个“3a”是我举的代表内存地址的例子,你只需知道是个内存地址就行了),而这个地址正是“Hello”这个字符串在内存中的地址。引用传递的例子(对象的引用做参数)引用传递的例子(对象的引用做参数)strchangeD

16、ata(str);执行这一句后,就把str传给了changeData方法中的StringBufferstrBuf,由于str中存放的是地址,所以,strBuf中也将存放相同的地址,请看图2:此时,str和strBuf中由于存放的内存地址相同,因此都指向了“Hello”。strBuf.append(World!);执行changeData方法中的这一句后,改变了strBuf指向的内存中的值,如下图3所示引用传递的例子(对象的引用做参数)引用传递的例子(对象的引用做参数)str所以,Test2这个程序最后会输出:AfterchangeData(n),str=HelloWorld!再看看Test3这

17、个程序。在没有执行到changeData方法的strBuf=newStringBuffer(“Hi“);之前,对象在内存中的图和上例中“图2”是一样的,而执行了strBuf=newStringBuffer(“Hi“);之后,则变成了:引用传递的例子(对象的引用做参数)引用传递的例子(对象的引用做参数)str此时,strBuf中存放的不再是指向“Hello”的地址,而是指向“Hi”的地址“3b”了,new操作符操作成功后总会在内存中新开辟一块存储区域。strBuf.append(World!);而执行完这句后,引用传递的例子(对象的引用做参数)引用传递的例子(对象的引用做参数)strstr通过上

18、图可以看到,由于str和strBuf中存放地址不一样了,所以虽然strBuf指向的内存中的值改变了,但sb指向的内存中值并不会变,因此也就输出了下面的结果:AfterchangeData(n),str=Hello而String类是个特殊的类,对它的一些操作符是重载的,如:Stringstr=“Hello”;等价于Stringstr=newString(“Hello”);Stringstr=“Hello”;str=str+“world!”;等价于str=newString(newStringBuffer(str).append(“world!”);因此,只要按上面的方法去分析,就会发现Strin

19、g对象和基本类型一样,一般情况下作为参数传递,在方法内改变了值,而原对象是不会被改变的。引用传递的例子(对象的引用做参数)引用传递的例子(对象的引用做参数)prog7.java,prog72.java结论:对象和引用型变量被当作参数传递给方法时,在方法实体中,无法给实际参数的引用重新赋值,但是可以改变它所指向对象的属性。综上所述,我们就会明白,在综上所述,我们就会明白,在Java中对象作为参中对象作为参数传递时,是把对象在内存中的地址拷贝了一份数传递时,是把对象在内存中的地址拷贝了一份传给了参数。传给了参数。引用传递的例子(对象的引用做参数)引用传递的例子(对象的引用做参数)8.4 8.4 递

20、归递归(recursion)(recursion)v 递归递归用自身的结构来描述自身典型的例子是阶乘运算v 简而言之简而言之递归就是自己调用自己【例例8-108-10】递归算法求递归算法求n!n!vn!的算法 n! = n(n-1)!(n-1)! = (n-1)(n-2)!(n-2)! = (n-2)(n-3)! 2!= 21! 1!= 1;v递递归归定定义义 F=nF=n!,设设计计算算阶阶乘乘的的“ “方方法法” ”为为fac (n)(n)1.当n1时,fac(n)=n*fac(n-1)2.当n=1时,fac(n)=1递归公式递归公式递归出口递归出口【例例8-108-10】递归算法求递归算

21、法求n!n!static long fac( int n)static long fac( int n) if (n = 1) if (n = 1) return 1; return 1; else else return n*fac(n-1); return n*fac(n-1); 执行分成两步执行分成两步, ,先递推,再回推。先递推,再回推。如如n=5n=55*fac(4)fac(5)=1204*fac(3)fac(4)=243*fac(2)fac(3)=62*fac(1)fac(2)=2fac(1)=1回回推推递递推推Prog3.java递归程序设计的规范递归程序设计的规范v计算递归公式

22、计算递归公式v确定递归出口确定递归出口【例例8-11】输出前输出前n n项项Fibonacci Fibonacci 序列序列 , ,每行输出每行输出6 6个。个。 Fibonacci Fibonacci 序列:序列: 1 1、1 1、2 2、3 3、5 5、8 8、1313、2121,3434 要求定义并调用函数要求定义并调用函数fib(n)fib(n),其功能是返回第,其功能是返回第n n项项FibonacciFibonacci数。例如,数。例如,fib(7)fib(7)的返回值是的返回值是13 13 递归公式:递归公式:fib(n) = fib(n-1)+fib(n-2)fib(n) =

23、fib(n-1)+fib(n-2)递归出口:递归出口:fib(1)=1fib(1)=1,fib(2)=1fib(2)=1static long static long fibfib( int n) if (n = 1 | n = 2 ) return 1;( int n) if (n = 1 | n = 2 ) return 1; else return else return fib(n-1)+fib(n-2)fib(n-1)+fib(n-2) Prog4.java例例8-128-12:汉诺塔(:汉诺塔(Hanoi)Hanoi)问题问题 据据古古印印度度神神话话,在在贝贝拿拿勒勒斯斯的的圣圣

24、庙庙里里安安放放着着一一块块铜铜板板,板板上上有有3根根宝宝石石针针。梵梵天天(印印度度教教的的主主神神)在在创创造造世世界界的的时时候候,在在其其中中的的一一根根针针上上摆摆放放了了由由小小到到大大共共64片片中中间间有有空空的的金金片片。无无论论白白天天和和黑黑夜夜,都都有有一一位位僧僧侣侣负负责责移移动动这这些些金金片片。移移动动金金片片的的规规则则是是:一一次次只只能能将将一一个个金金片片移移动动到到另另一一根根针针上上,并并且且在在任任何何时时候候以以及及任任意意一一根根针针上上,小小片片只只能能在在大大片片的的上上面面。当当64个个金金片片全全部部由由最最初初的的那那根根针针上上移

25、移动动到到另另一一根根针针上上时时,这世界就在一声霹雳中消失。这世界就在一声霹雳中消失。若用若用A A、B B和和C C表示表示3 3根针,将根针,将n n个金片由个金片由A A针移动到针移动到C C针,步骤如下:针,步骤如下: 1.1.将将A A上的上的n-1n-1个金片借助个金片借助C C针移动到针移动到B B针上。针上。2.2.将将A A针上剩下的一个金片由针上剩下的一个金片由A A针移动到针移动到C C针上。针上。3.3.将最后剩下的将最后剩下的n-1n-1个金片借助个金片借助A A针由针由B B针移动到针移动到C C针上。针上。static void hanoi( int n , c

26、har a , char b , char c ) if (n = = 1) moves(a, c); else hanoi(n - 1, a, c, b); moves(a, c); hanoi(n - 1, b, a, c); 在在mainmain中调用中调用hanoi(3,A,B,C)From A To CFrom A To BFrom C To BFrom A To CFrom B To AFrom B To CFrom A To Cstatic void moves(char a , char b )System.out.println(From +a +to + b);Prog5.

27、javaDemoDemo【例补例补8-18-1】求表达式的值求表达式的值: : 要求输入数据要求输入数据m m的的值必须大于值必须大于n,n,否则重输。否则重输。【例补例补8-28-2】验证哥德巴赫猜想:一个大于等于验证哥德巴赫猜想:一个大于等于6 6的偶数,都的偶数,都能将它分解为两个素数之和。能将它分解为两个素数之和。解题:解题:1.1.设计一个求阶程设计一个求阶程p!p!的方法的方法fac(p)fac(p)2.2.调用该方法求出表达式的值调用该方法求出表达式的值解题:解题:1.1.设计一个求判断素数的方法设计一个求判断素数的方法prime(p)prime(p)2.2.输入的数放在变量输入

28、的数放在变量n n中(要求中(要求n n是是=6=6的偶数的偶数3.3.调用方法计算调用方法计算prime(a)prime(a)及及prime(n-a)prime(n-a)的返回值,若均为的返回值,若均为truetrue,则则n n可以分解成可以分解成a+(n-a)a+(n-a)二个素数之和二个素数之和。4.4.a a:3n/2,3n/2,步长为步长为2 2Prog9.java引用传递和值传递区别引用传递和值传递区别传递简单类型的变量和传递引用(对象)有重要区传递简单类型的变量和传递引用(对象)有重要区别:别:传递简单类型变量就是将其值传递给形参。改变方传递简单类型变量就是将其值传递给形参。改变方法内部的参数不会影响方法外部的变量值。这种法内部的参数不会影响方法外部的变量值。这种传递称为传递称为值传递值传递。传递对象意味将对象的引用传递给形参。传递对象意味将对象的引用传递给形参。方法体内方法体内的局部对象的任何变化的局部对象的任何变化都会影响作为参数传递的都会影响作为参数传递的原对象。这种传递称为原对象。这种传递称为引用传递引用传递。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号