1、第5章 方法,本章学习重点,方法定义和调用 。 递归算法 。 变量作用域 。,5.1 方法的概念和定义,在一个程序中,相同的程序段可能会多次重复出现,为了减少代码量和出错概率,一般将这些重复出现的代码段单独抽出来,写成子程序形式,以供多次调用。 这类子程序在Java语言中叫做方法。 这类子程序也叫函数(如C语言)。,方法的好处,缩短程序 提高程序的可维护性 分而治之 方法是Java语言的重要概念之一,同时也是实现结构化程序设计的主要手段,结构化程序设计是面向对象程序设计的基础,因此,掌握Java方法非常重要。,main()方法 System.out.println(),int Average(
2、int x, int y)int result;result = (x + y) / 2;return result;,自定义方法的一般形式,返回值类型 方法名(类型 形式参数1, 类型 形式参数2, )方法体,注意,(1)如果不需要形式参数,则参数表(即方法头的小括号)中就空着。 (2)返回值类型与return语句配合,即return语句后面的表达式类型应与返回值类型相一致。如果不需要返回值,则应该用void定义返回值类型,同时return语句之后不再需要任何表达式。,注意,(3)一个方法中可以有多条的return语句,只要方法执行到其中的任何一条return语句时,就中止方法的执行,返回到
3、调用它的地方。 (4)方法内部可定义只能自己使用的变量,称之为局部变量(或内部变量),局部变量的作用域仅限于定义它们的地方起一直到方法体结束。 (5)方法中局部变量的确定值要在该方法被调用时由实际参数传入确定。,【例5-1】不带参数同时也没有返回值的方法示例。void Print_wang( ) System.out.println(“*“);System.out.println(“ * “);System.out.println(“ * “);System.out.println(“*“);System.out.println(“ * “);System.out.println(“ * “)
4、;System.out.println(“*“);,【例5-2】带参数但没有返回值的方法示例。void Print_lines(int i) for(int j=0;ji;j+)System.out.println(“*“);,double Area(double a,double b,double c) double s,area;s = (a+b+c)/2;area = Math.sqrt(s*(s-a)*(s-b)*(s-c);return area;,【例5-4】定义求圆面积的方法。double Circle(double radius) double area;area = 3.14
5、*radius*radius;return area;,5.2 方法的调用,在程序中是通过对方法的调用来执行方法体的,Java语言中,方法调用的一般形式为: 方法名(实际参数表) 对无参方法调用时则只要写上小括号即可。实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式,各实参之间要用逗号间隔开,并注意需与形参相对应。,调用方式,(1)方法表达式 (2)方法语句 (3)方法参数,【例5-5】调用Average方法。 public class Test static int Average(int x, int y)int result;result = (x + y) / 2;retu
6、rn result;public static void main(String args )int a = 12;int b = 24;int ave = Average(a, b); System.out.println(“Average of “+ a +“ and “+b+“ is “+ ave); ,【例5-6】调用例5-1中的Print_wang方法。 public class Test static void Print_wang() System.out.println(“*“);System.out.println(“ * “);System.out.println(“ *
7、“);System.out.println(“*“);System.out.println(“ * “);System.out.println(“ * “);System.out.println(“*“);public static void main(String args )Print_wang(); ,【例5-7】调用Average方法。 public class Test static int Average(int x, int y)int result;result = (x + y) / 2;return result;public static void main(String
8、 args )int a = 12;int b = 24;System.out.println(“Average of “+ a +“ and “+b+“ is “+ Average(a, b); ,超前引用,【例5-8】调用求三角形面积的方法。 public class Test public static void main(String args) double a=3,b=4,c=5,s; /三角形的三条边 double area; /三角形的面积area = Area(a,b,c); /调用方法求面积System.out.println(“该三角形的面积为:“+area);/定义求三
9、角形面积的方法static double Area(double a,double b,double c) double s,area;s = (a+b+c)/2;area = Math.sqrt(s*(s-a)*(s-b)*(s-c);return area; ,参数传递,当对带参方法进行调用时,实际参数将会传递给形式参数,也就是实参与形参结合的过程。 参数是方法调用时进行信息交换的渠道之一,方法的参数分为形参和实参两种,形参出现在方法定义中,在整个方法体内都可以使用,离开该方法则不能使用。实参出现在主调方法中,进入被调方法后,实参变量也不能使用。 形参和实参的功能是作数据传送。发生方法调用
10、时,主调方法把实参的值传送给被调方法的形参,从而实现主调方法传递数据给被调方法。,形参和实参,(1)形参只在方法被调用时才分配内存单元,在调用结束时,便会“释放”所分配的内存单元。因此,形参只在本方法内有效,方法调用结束后就不能再使用。方法内部定义的(局部)变量也是如此。 (2)实参可以是常量、变量、表达式,甚至是方法等,无论实参是何种类型的量,在进行方法调用时,它们都必须具有确定的值,以便把这些值传递给形参。 (3)实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。 (4)方法调用中发生的数据传递是单向的,因此在方法调用过程中,若形参的值改变,则实参不会跟着改变。,
11、【例 5-9】写出下列程序的运行结果。 public class Test static void Swap(int x,int y) int temp;temp=x; x=y; y=temp;System.out.println(“x=“+x+“,y=“+y);public static void main(String args) int x=10,y=20;Swap(x,y);System.out.println(“x=“+x+“,y=“+y); ,程序运行结果: x=20,y=10 x=10,y=20,图5-1 方法的参数传递,返回值,带返回值方法的一般形式为:返回值类型 方法名(类型
12、 形式参数1, 类型 形式参数2, )方法体return 表达式;,返回值,方法返回值是指方法被调用之后,执行方法体中的程序段所取得的并通过return语句返回给主调方法的值。 方法的返回值只能通过 return语句返回给主调方法。 方法内部返回值的数据类型和方法定义中方法的返回值类型应保持一致。 不返回方法值的方法,可以明确定义其为“空类型“,类型说明符为“ void “。,方法嵌套及递归,Java语言允许在一个方法的定义中出现对另一个方法的调用,我们把这样的情况称为方法的嵌套(调用),即在被调方法中又调用了其它方法。,【例 5-10】写出下列程序的运行结果。 public class Te
13、st static int m1(int a ,int b) int c;a+=a;b+=b; c=m2(a,b);return(c*c);static int m2( int a,int b) int c;c=a*b%3;return( c );public static void main(String args) int x=1,y=3,z;z= m1(x,y);System.out.println(“z=“+z); ,程序运行结果如下:z=0,public class Test static double Circle(double radius) double area;area =
14、 3.14*radius*radius;return area;static double Cylinder(double r,double h)double vol;vol = Circle(r)*h;return vol;public static void main(String args) double r=5.5,h=30,v;v = Cylinder(r,h);System.out.println(“底面半径为“+r+“,高度为“+h+“的圆柱体体积:“+v); ,【例 5-11】定义一个求圆柱体体积的方法,要求利用例5-4求圆面积的方法来实现,并在main()方法中进行验证。,递
15、归,一个方法在它的方法体内调用它自身的情况称为递归调用,这是一种特殊的嵌套调用,称之为递归方法。,int m(int x) int y; z=m(y); return z; ,【例 5-12】用递归法计算n的阶乘。,n!可用下述公式递归表示:n!=1 (n=0,1)n!= n (n-1)! (n1),static long factorial(int n)long f=0;if(n0) System.out.println(“n0,input error“);else if(n=0|n=1) f=1;else f=factorial(n-1)*n;return f;,【例 5-12】用递归法计
16、算n的阶乘。,5.3 变量作用域,局部(动态)变量也称为内部变量,局部变量是在方法内作定义说明的,在各个方法(包括main()方法)中定义的变量及方法的形式参数变量均为局部变量。 其作用域仅限于方法内,离开该方法后再使用这种变量则是非法的,因为它已经被“释放”不存在了。,int m1(int a) /*方法m1*/ int b,c; int m2(int x) /*方法m2*/ int y,z; public static void main(String args) /*主方法main()*/ int m,n; ,提示,1) 主方法中定义的变量只能在主方法中使用,因为它也是一个方法,与其它方法是平行关系。 2) 形参变量是属于被调方法的局部变量,而实参变量一般是属于主调方法的局部变量。 3) 允许在不同的方法中使用相同的变量名,它们代表不同的对象,各自在自己的作用域中发挥作用。如进行方法调用时,形参和实参的变量名都为x,这是允许的。 4) 在复合语句中定义变量,其作用域只在复合语句范围内。,作业,1 3 5 8 9 10,