1.1什么是方法
方法顾名思义就是解决问题的办法,在程序员写代码的时候,会遇到很多逻辑结构一样,解决相同问题时,每次都写一样的代码,这会使代码看起来比较绒余,代码量也比较多,为了解决这个问题,我们把代码逻辑相同的代码写成一个方法,当我们解决相同问题时,直接调用这个方法,这会使代码看起来简洁明了。
方法:在Java中就是一个代码片段,与C语言中的函数类似。
方法存在的意义:
1. 是能够模块化的组织代码(当代码规模比较复杂的时候 ).
2. 做到代码被重复使用, 一份代码可以在多个位置使用.
3. 让代码更好理解更简单.
4. 直接调用现有方法开发, 不必重复造轮子.
举个列子:当我们需要求一个数的阶乘时
public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int x= scanner.nextInt();for (int i = x-1; i >=1 ; i--) {x*=i;}System.out.println(x);}
你可能会写出这样的代码,是不是看见循环就烦,当我们学会方法就会写出下面这种简洁的代码
public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int x= scanner.nextInt();System.out.println(fac1(x));}
是不是看着简洁多了
2.方法的基本格式
// 方法定义
public static 方法返回值 方法名称([参数类型 形参 ...]){方法体代码;[return 返回值];
}
// 方法调用
返回值变量 = 方法名称(实参...);
接下来来个实例:
public static int fac1(int x){for (int i = x-1; i >=1 ; i--) {x*=i;}return x;
}
——————————————————————————————————————————————————public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int x= scanner.nextInt();System.out.println(fac1(x));}
横线上面是方法的定义,下面是方法的调用;
注意事项 :
1. 方法定义时, 参数可以没有. 每个参数要指定类型
2. 方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void
3. 方法定义时的参数称为 "形参", 方法调用时的参数称为 "实参".
4. 方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可.
5. Java 中没有 "函数声明" 这样的概念.
3.方法的执行过程
1.定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
2.当方法被调用的时候, 会将实参赋值给形参.
3.参数传递完毕后, 就会执行到方法体代码.
4.当方法执行完毕之后(遇到 return 语句), 就执行完毕, 回到方法调用位置继续往下执行.
5.一个方法可以被多次调用.
4.实参和形参
在定义方法时,参数类型(形参)可以有多个或者一个也没有
在调用方法时传递的参数叫做实参,参数要与方法的形参匹配(参数的个数和类型)
形参是实参的一份临时拷贝,即调用方法时创建,方法结束后销毁
举个例子:交换两个数
public static void swap(int x,int y){int t=x;x=y;y=t;
}public static void main(String[] args) {int x=10;int y=20;System.out.println("交换前:x="+x+"y="+y);swap(x,y);System.out.println("交换后:x="+x+"y="+y);}
这样写结果是不是交换了呢?肯定不是
主要原因还是因为形参只是实参的一份临时拷贝
那就没办法交换两个数了呗,交换两个数要传引用数据类型
比如数组就是引用数据类型
public static void swap1(int arr[]){int x=arr[0];arr[0]=arr[1];arr[1]=x;}public static void main(String[] args) {int []arr={1,2};System.out.println("交换前arr[0]="+arr[0]+" arr[1]="+arr[1]);swap1(arr);System.out.println("交换后arr[0]="+arr[0]+" arr[1]="+arr[1]);}
5.没有返回值的方法
没有返回值的方法即方法的返回值类型void
例如:
public static void print(){System.out.println("hhhhhh");}public static void main(String[] args) {print();}
同时,刚才的交换两个数也是没有返回值的方法
如果想要在某个条件下提前结束方法,也可以在满足条件后直接return
6.方法的重载
当我们想要一个函数的功能,实现多种参数时,我们就可以使用方法的重载
例子:
我们使用add方法时,即想实现两个整形的相加,又想实现两个double类型的相加,但是两种方法都是用作加法,记方法名又太麻烦,所以我们会选择重载
public static int add(int x,int y){return x+y;}public static double add(double x,double y){return x+y;}public static void main(String[] args) {System.out.println(add(1,2));System.out.println(add(1.2,2.2));}
方法名都是add,方法名相同,但是实现的功能不同,就叫做方法的重载
重载的规则:
1.针对同一个类
2.方法名相同
3.方法的参数不同(参数个数或者参数类型)
4.方法的返回值类型不影响重载.
7.方法的递归
什么是递归:
一个方法在执行过程中调用自身, 就称为 "递归"
经典例子:斐波那契数列
public static int fib1(int x){if(x==1||x==2){return 1;}else{return fib1(x-1)+fib1(x-2);}
}
求斐波那契数列的第几个数时,这个数是前两个斐波那契数之和,而第一个和第二个斐波那契数是1,再求第x个斐波那契数时,需要先求前两个斐波那契数,当x为1或2时,返回1
红色箭头代表递的过程,蓝色箭头代表归的过程
小结:
1.递归是一种重要的编程解决问题的方式.
2.有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.
3.有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效