Java中的方法
一.方法的基本用法
1.什么是方法
方法就是一个代码片段,类似于c语言中的“函数”
方法存在有什么用呢?
①能够模块化的组织代码(当代码规模比较复杂的时候)
②做到代码能够被重复使用,一份代码可以在多个位置使用
③让代码更好理解,更简单
④直接调用现有方法开发,不必重复工作
2.方法怎么定义
//方法定义
public static 方法返回值 方法名称([参数类型 形参...]){
//方法体;
[return 返回值];
}
//方法调用
返回值变量=方法名称(实参)
示例:实现一个方法实现两个数相加
public class Test {
public static void main(String[] args) {
int a=10;
int b=20;
//方法的调用
int ret=add(a,b);
System.out.println(ret);
}
public static int add(int x,int y){
return x+y;
}
}
//打印结果
ret=30;
注意事项:
①方法在定义时,参数可以没有,每个参数要指定类型
②方法定义时,可以没有返回值,如没有返回值,返回值类型应用void书写
③方法定义时的参数称为形参,方法调用时的参数称为实参
④Java中没有"函数声明"概念
3.方法调用的执行过程
基本规则:
①定义方法的时候,不会执行方法的代码,只有调用的时候才会执行
②当方法被调用的时候,会将实参赋值给形参
③参数传递完毕后,就会执行到方法体代码
④当方法执行完毕(即遇到return语句),就执行完毕,回到方法调用位置继续往下执行
注意:一个方法可以被调用多次(既可以分别传不同的参数进去)
4.实参和形参的关系
在这里我们需要考虑一个重要的问题就是形参的改变影响不影响实参的改变
举个例子:
public class Test2 {
public static void main(String[] args) {
int a=10;
int b=20;
swap(a,b);
System.out.println(a+","+b);
}
public static void swap(int x,int y){
int tmp=x;
x=y;
y=tmp;
}
}
//打印结果:10,20
我们可以看到上述代码,形参x,y的交换并没有使实参也进行交换,是怎么回事呢?
示意图:
从图中很清楚的看到,值的交换只是在给形参分配的空间中进行了交换,实际上在实参空间里的两个值并没有因此发生交换,所以结果才会是没有改变,对于基础类型来说,形参相当于是将实参拷贝了一份,即传值调用
那么我们应该传递什么解决上述这个问题?
解决办法:传引用类型参数(例如可以用数组来解决)
参考代码如下:
public class Test2 {
public static void main(String[] args) {
int[] arr={10,20};
swap(arr);
System.out.println(arr[0]+","+arr[1]);
}
public static void swap(int[] arr1){
int tmp=arr1[0];
arr1[0]=arr1[1];
arr1[1]=tmp;
}
}
//打印结果 20,10
示意图:
数组arr里保存的是数组的首地址,arr称为引用。将arr传递给arr1,即将arr中的地址拷贝一份给arr1,所以arr1也指向相同的一块内存区,这时候改变形参的值,就可以改变实参的值。
二.方法的重载
有些时候,我们需要用到一个函数同时兼容多种参数的情况,就可以使用到方法重载
方法重载需要满足的条件:
①方法名要相同
②参数列表不同(参数类型或者个数不同)
③返回值类型可以相同可以不相同
④必须在同一个类中或者在继承关系上
public class Test2 {
public static void main(String[] args) {
int a=10;
int b=20;
int ret=add(a,b);
System.out.println(ret);
double a1=10.5;
double b1=20.5;
double ret1=add(a1,b1);
System.out.println(ret1);
double a2=10.5;
double b2=10.5;
double c2=20.5;
double ret2=add(a2,b2,c2);
System.out.println(ret2);
}
public static int add(int x,int y){
return x+y;
}
public static double add(double x,double y){
return x+y;
}
public static double add(double x,double y,double z){
return x+y+z;
}
}
上述代码,同一个方法名,提供不同版本的实现,称为方法重载
三.方法的递归
什么是递归?
一个方法在执行过程中调用自身,就称为“递归”
递归需要满足的条件:
①调用自己本身
②有一个趋近于终止的条件
代码示例:
public class Test2 {
public static void main(String[] args) {
//递归求n的阶乘
int n=5;
int ret=factor(n);
System.out.println(ret);
}
public static int factor(int n){
if(n==1){ //递归终止条件
return 1;
}else
return n*factor(n-1);
}
}
具体流程:
所谓递归,就是先递后归(遇到满足终止条件时开始归),如上图,上面的直线就是递的过程,遇到结束条件n==1返回1开始归,就是下面的曲线部分。
递归是一种重要的编程解决问题的方式
有些问题天然就是使用递归方式定义的(例如:二叉树,斐波那契数列等),用递归就很容易解
有些问题使用递归和非递归都可以解决,此时使用非递归循环可能更加高效,因为递归进行了大量的重复运算,降低了效率