配色: 字号:
《Java程序设计教程》04 方法与数组
2023-05-25 | 阅:  转:  |  分享 
  
第4章 方法与数组 本章学习目标 理解方法的概念。掌握方法的定义和调用。熟悉递归算法。掌握数组的概念和使用。理解方法的数组参数传递。4.1
方法的概念和定义 在一个程序中,相同的程序段可能会多次重复出现,为了减少代码量和出错概率,在程序设计中,一般将这些重复出现的代
码段提炼出来,写成子程序的形式,以供多次调用。这类子程序在Java语言中叫做方法。结构化编程语言中称之为过程或函数,尽管叫法不同,
但其本质是一样的。方法的好处缩短程序提高程序的可维护性分而治之 方法是Java语言的重要概念之一,也是实现结构化程序设计的主要
手段,结构化程序设计是面向对象程序设计的基础,因此,掌握方法非常重要。 main()方法 System.out.println()
int Average(int x, int y) { int result; result = (x + y) / 2;
return result; }自定义方法的一般形式 返回值类型 方法名(类型 形式参数1, 类型 形式参数2, ……
) { 方法体 }注意 (1)如果不需要形式参数,则参数表(即方法头的小括号)中就空着。 (2)返回值类型与return语句要匹
配,即return语句后面的表达式类型应与返回值类型相一致。另外,如果不需要返回值,则应该用void定义返回值类型,同时retur
n语句之后不带任何表达式。 注意(3)一个方法中可以有多条return语句,方法执行到其中的任何一条return语句时,都会结束方
法的执行,并返回到调用它的地方。对于void类型的方法允许方法中没有任何return语句,此时,只有当执行完整个方法体代码,程序流
程才返回到调用它的地方。(4)方法内可以定义只能在方法内部使用的变量,称之为局部变量(或内部变量),如上述Average方法中的整
型变量x、y以及result,它们都是局部变量,只在Average方法中有效,或者说x、y以及result变量的作用域仅限于定义它
们的地方开始一直到该方法体结束。(5)方法中形参的值要在该方法被调用时由实际参数传入确定。 【例4-1】不带参数同时也没有返回值的
方法示例。 void Print_wang( ) { System.out.printl
n(""); System.out.println(" "); Syst
em.out.println(" "); System.out.println("")
; System.out.println(" "); System.out.printl
n(" "); System.out.println(""); }【例4-2】带
参数但没有返回值的方法示例。 void Print_lines(int i) { for(
int j=0;j double Area(double a,double b,double c) { doubl
e s,area; s = (a+b+c)/2; area = Math.sqrt(s(s-a)(
s-b)(s-c)); return area; }【例4-4】定义求圆面积的方法。 double
Circle(double radius) { double area; area =
3.14radiusradius; return area; }4.2 方法的调用 在程序中是通过对方法
的调用来执行方法体的,Java语言中,方法调用的形式: 方法名(实际参数表) 对无参方法调用时则只要写上小括号即可。实际参数表中的
参数可以是常数、变量或构造类型数据以及表达式,各实参之间要用逗号间隔开,并注意顺序须与形参相对应。4.2.1 调用方式 (1)方
法表达式 (2)方法语句 (3)方法参数 【例4-5】调用Average方法。public class Test{ stati
c int Average(int x, int y) { int result; resu
lt = (x + y) / 2; return result; } public static voi
d main(String args[ ]) { int a = 12; int b = 24;
int ave = Average(a, b); System.out.println("Average of "
+ a +" and "+b+" is "+ ave); }}【例4-6】调用例4-1中的Print_wang方法。publ
ic class Test{ static void Print_wang() { Sy
stem.out.println(""); System.out.println("
"); System.out.println(" "); System.out.pr
intln(""); System.out.println(" ");
System.out.println(" "); System.out.println("
"); } public static void main(String args[ ]) {
Print_wang(); }}【例4-7】调用Average方法。public class Test{ static
int Average(int x, int y) { int result; resul
t = (x + y) / 2; return result; } public static void
main(String args[ ]) { int a = 12; int b = 24;
System.out.println("Average of "+ a +" and "+b+" is "+ Average(a
, b)); }}本例与【例4-5】相比,省去了ave变量,直接将Average方法的返回值在标准输出方法中进行输出前面的几
个例子,用户自定义的方法都是写在main()方法的前面,能否将其写在后面呢?其他编程语言如C语言是不支持超前引用的,如果自定义函数
放在函数调用之后才定义,必须在函数调用前添加函数的原型声明(函数头后加分号),否则无法通过编译。【例4-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); //调用方法求面积 Sy
stem.out.println("该三角形的面积为:"+area); } //定义求三角形面积的方法 stat
ic double Area(double a,double b,double c) { dou
ble s,area; s = (a+b+c)/2; area = Math.sqrt(s(s-a)
(s-b)(s-c)); return area; }}4.2.2 参数传递 当对有参数的方法进行调用时
,实际参数将会传递给形式参数,称之为实参与形参的结合。参数是方法调用时进行数据传递的途径,方法的参数分为形参和实参两种,形参出现在
方法定义中,在整个方法体内都可以使用,离开该方法则不能使用;实参出现在方法调用语句中,进入被调方法后,实参变量不能使用。形参和实参
(1)形参变量只有在方法被调用时才分配内存单元,在调用结束时,便会“释放”所分配的内存单元。因此,形参只有在本方法内部有效。方法
调用结束返回调用处后,不能再使用形参变量。方法内部定义的局部变量也同样不能访问。 (2)实参可以是常量、变量、表达式,甚至是方法调
用,无论实参是何种类型的量,在进行方法调用时,都必须具有确定的值,以便把这些值传递给形参。 形参和实参 (3)实参和形参在数量上,
类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。(4)方法调用中发生的数据传递是单向的,因此在方法调用过程中,若形参的值改
变,则实参不会跟着改变。 【例 4-9】写出下列程序的运行结果。public class Test{ static void S
wap(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; Swa
p(x,y); System.out.println("x="+x+",y="+y); }}程序运行结果:x=20
,y=10x=10,y=20图4-1 方法的参数传递4.2.3 返回值带返回值方法的一般形式为: 返回值类型 方法名(类型 形
式参数1, 类型 形式参数2, …… ) { 方法体 return 表达式; }返回值方法的返回值只能通过return语句
返回。 return返回值的数据类型和方法定义中方法的返回值类型须保持一致。 不返回值的方法,可以明确定义其为“空类型”,其说明
符为void。 4.2.4 方法嵌套及递归 Java语言允许在一个方法的定义中出现对另一个方法的调用,我们把这样的情况称为方法的
嵌套(调用),即在被调方法中又调用了其它方法。 【例 4-10】写出下列程序的运行结果。public class Test{ s
tatic int m1(int a ,int b) { int c; a+=a; b+=b
; c=m2(a,b); return(cc); } static int m2( i
nt a,int b) { int c; c=ab%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 = 3.14radiusradius;
return area; } static double Cylinder(double r,double h)
{ double vol; vol = Circle(r)h; return vo
l; } public static void main(String[] args) { double
r=5.5,h=30,v; v = Cylinder(r,h); System.out.println("底
面半径为"+r+",高度为"+h+"的圆柱体体积:"+v); }}【例 4-11】定义一个求圆柱体体积的方法,要求利用例4-
4求圆面积的方法来实现。递归 一个方法在它的方法体内调用其自身的情况称为递归调用,这是一种特殊的嵌套调用,这样的方法称为递归方法。
int m(int x) { int y; z=m(y); return z; } 【例 4-12】用递归法
计算n的阶乘。n!可用下述公式递归表示: n!=1 (n=0,1) n!= n × (n-1)!
(n>1) static long factorial(int n) { long f=0;
if(n<0) System.out.println("n<0,input erro
r"); else if(n==0||n==1) f=1; else
f=factorial(n-1)n; return f; }【例 4-12】用
递归法计算n的阶乘。4.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)在复合语句中也可以定义变量,其作用域只在复合语句范围内。 4.4 数组 4.4.1
数组的概念 在解决现实问题时,经常需要处理一批类似的数据,如对6位同学的成绩进行处理,如果利用基本数据类型的话,那就必须定义6个变
量:result1、result2、result3、result4、result5和result6。如果有60位同学,那就需要定义
60个基本数据类型的变量,这是很不合适的。为了便于处理一批同类型的数据,Java语言引入了数组类型。 数组特点 首先,数组中的每个
元素都是相同数据类型的;其次,数组中的这些相同数据类型元素是通过数组下标来标识的,并且该下标是从0开始的;最后,数组元素在内存中的
存放是连续的。 4.4.2 数组的声明和创建 一维数组的声明格式为: 数据类型 [ ] 数组名;或 数据类型 数组名[
]; short [ ] x;或 short x[ ];short x[ 60]; 创建数组 初始化方式new操作符方式 数据
类型 数组名[ ] = {数据1,数据2,...,数据n}; short x[ ] = {1,2,3,4,5,6};char
ch[ ] = {‘a’,’b’,’c’,’d’,’e’,’f’};数据类型 数组名[ ] = new 数据类型[元素个数];
short x[ ] = new short[6]; x[0] = 9;x[1] = 8;short x[ ] = new s
hort[6];int len = x.length;//通过循环给每个数组元素赋值for(int i=0;i x[i]=i2;//通过循环输出每个数组元素的值for(int i=0;i print(x[i] + “ ”);二维数组的声明格式如下: 数据类型 [ ] [ ] 数组名;或 数据类型 数组
名[ ] [ ];short [ ] [ ] x;float y [ ] [ ];short [ ] [ ] x = { {1
,2,3}, {4,5,6}, {7,8,9} };float y [ ] [ ] = {{0.1,0.2},{0.3,0.4,
0.5},{0.6,0,7,0.8,0.9}};short [ ] [ ] x = new short[3][3]; floa
t y [ ] [ ]= new float[3][]; y[0] = new float[2]; y[1] = new f
loat[3]; y[2] = new float[4];非等长数组由于各行元素个数不同,只能采取各行分别进行创建的方式 4.4
.3 数组的应用举例 数组很适合用来存储和处理同类的一批数据,请看以下几个关于数组的应用例子。【例 4-16】某同学参加了高数、
英语、Java语言、线性代数和物理5门课程的考试,假定成绩分别为70、86、77、90和82,请用数组存放其成绩,并计算5门课程的
最高分和平均分。public class Score{ public static void main(String[] ar
gs) { int x[]={70,86,77,90,82}; int max=0; //临时变量
int sum=0; //总分 for(int i=0;i i]>max) max=x[i]; sum+=x[i]; } System.out.pri
ntln("最高分:"+max); System.out.println("平均分:"+sum1.0/x.length
); //注意“/”运算 }}程序运行结果如下:最高分:90平均分:81.0【例 4-18】试用冒泡法对10,50,20,
30,60和40数列进行降序排序。public class BubbleSort{ public static void ma
in(String[] args) { int x[]={10,50,20,30,60,40}; int
temp; //临时变量 for(int i=1;i r (int j=0;j ) { //交换位置 temp=x[j]; x[j]=x[j+1]; x[j+1]=temp; } } for(int i=0;i
献花(0)
+1
(本文系大高老师首藏)