一、什么是方法?
在日常生活中,方法可以理解为要做某件事情,而采取的解决方法
比如:小明刚出家门,要去学校上课,这就面临一个问题需要解决,小明应该怎么去学校呢?有什么解决办法吗?
可以采用坐公交车或者走路又或者坐出租车的方法去学校,那么,这种解决某件事情的办法,就称之为方法
在Java中,方法就是用来解决某件事情或实现某个功能的代码块
方法的实现过程中,会包含很多语句用于完成某个特定功能---通常是处理文本,控制输入或计算数值
二、方法的语法格式?
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...){
方法体(多个执行语句);
...
return 返回值;
}
修饰符:方法的修饰符有很多,有对访问权限进行限定的(private,public等),有静态修饰符static,还有最终修饰符final等,这些老师暂时没讲,就先记着public static
返回值类型:用于限定返回值的数据类型
方法名:一个名字,但取名最好要有意义,尽量用英文,不要用拼音。为了方便我们调用方法
参数类型:用于接收调用方法时传入的数据的类型
参数名:用于接收调用方法时传入的数据的变量
方法体:实现该功能的代码
return:结束方法,将返回值带给调用者
例如:定义一个方法,计算两个整数的和,并输入这个结果
1 package com.cnblogs; 2 3 public class MethodDemo { 4 public static void main(String[] args) { 5 int c = sum(5, 6); 6 System.out.println("这两个数的和为:" + c); 7 } 8 9 public static int sum(int a, int b) { 10 int c = 0; 11 c = a + b; 12 return c; 13 } 14 }
结果为:这两个数的和为:11
三、方法调用的内存图
分析:
1. 类,以及类的一系列方法都时存放在方法区中
2. main方法是程序的入口,运行main方法,将方法区的main方法加载到栈区中,创建一个int类型的变量c
3. 调用sum()方法,并将sum方法返回的值赋给变量c。调用sum()方法时,从方法区将sum方法加载到栈区
4. 创建两个形参变量a和b,由于调用sum方法时传了两个实参5和6,分别对应赋值a和b
5. 创建局部变量c,进行运算,将a+b的和赋给c,并且将结果c返回给调用者,此时sum方法结束,消栈,将栈区的sum方法清除,节约内存
6. 将sum(5, 6)方法返回的值赋给局部变量c(这个c是main方法中的局部变量),使用输出语句打印c的值,此时main方法结束,消栈,将栈区的sum方法清除,节约内存
四、void关键字
如果一个方法没有明确的返回值,则使用返回值类型使用void代替
1 package com.cnblogs; 2 3 public class MethodDemo { 4 public static void main(String[] args) { 5 int x = 5; 6 int y = 6; 7 printNum(x, y); 8 } 9 10 public static void printNum(int a, int b) { 11 System.out.println("a的值为:" + a + "\n" + "b的值为:" + b); 12 } 13 }
结果为:a的值为:5
b的值为:6
五、方法有哪几种方式?
1)有参有返回值
2)有参无返回值
3)无参有返回值
4)无参无返回值
1 package com.cnblogs; 2 3 public class MethodDemo { 4 public static void main(String[] args) { 5 6 } 7 //有参有返回值 8 public static int sum(int a, int b) { 9 return a + b; 10 } 11 //有参无返回值 12 public static void printNum(int a) { 13 System.out.println("值为:" + a); 14 } 15 //无参有返回值 16 public static int returnNum(){ 17 return 3; 18 } 19 //无参无返回值 20 public static void helloWorld() { 21 System.out.println("Hello World!"); 22 } 23 }
六、方法的调用有几种方式?
1)单独调用 -> 没有返回值的方法使用这种调用方式
2)赋值调用 -> 有返回值的方法调用方式
3)输出调用 -> 有返回值的方法调用方式
1 package com.cnblogs; 2 3 public class MethodDemo { 4 public static void main(String[] args) { 5 //单独调用 6 helloWorld(); 7 //赋值调用,通常用于如果后续还需要对这个结果进行处理的话,就使用这种方式 8 int a = returnNum(); 9 //输出调用 10 printNum(5); 11 } 12 //有参有返回值 13 public static int sum(int a, int b) { 14 return a + b; 15 } 16 //有参无返回值 17 public static void printNum(int a) { 18 System.out.println("值为:" + a); 19 } 20 //无参有返回值 21 public static int returnNum(){ 22 return 3; 23 } 24 //无参无返回值 25 public static void helloWorld() { 26 System.out.println("Hello World!"); 27 } 28 }
七、方法的重载
在同一个类中具有多个重名的方法叫做方法重载,方法重载是让类以统一的方式处理不同类型数据的一种手段
具备重载的三个条件:
1)在同一个类中
2)方法名必须相同
3)方法的参数列表不同(参数类型不同或者参数个数不同,与返回值类型没有关系)
扩展:
1)和成员方法一样,构造方法也可以重载
2)声明为final的方法不能被重载
1 package com.cnblogs; 2 3 public class MethodDemo { 4 public static void main(String[] args) { 5 System.out.println(sum(6.0, 7.3)); 6 System.out.println(sum(6, 7)); 7 } 8 9 public static int sum(int a, int b) { 10 return a + b; 11 } 12 public static double sum(double a, double b) { 13 return a + b; 14 } 15 }
八、方法的参数列表
如果是基本类型 -> 实际传递的是数值,形参的改变不会影响实参
如果是引用类型 -> 实际传递的是地址值,形参的改变会影响实参
1)基本类型时?
1 public class ArgsDemo { 2 public static void main(String[] args) { 3 // 定义变量 4 int a = 10; 5 int b = 20; 6 System.out.println("a:" + a + ",b:" + b);// a:10,b:20 7 change(a, b); 8 System.out.println("a:" + a + ",b:" + b);// a:10,b:20 9 } 10 11 public static void change(int a, int b) { // a=10,b=20 12 System.out.println("a:" + a + ",b:" + b);// a:10,b:20 13 a = b; // a=20; 14 b = a + b;// b=40; 15 System.out.println("a:" + a + ",b:" + b);// a:20,b:40 16 } 17 }
2)引用类型时?
1 public class ArgsDemo2 { 2 public static void main(String[] args) { 3 int[] arr = { 1, 2, 3, 4, 5 }; 4 for (int x = 0; x < arr.length; x++) { 5 System.out.println(arr[x]);//1,2,3,4,5 6 } 7 change(arr); 8 for (int x = 0; x < arr.length; x++) { 9 System.out.println(arr[x]);//1,4,3,8,5 10 } 11 } 12 13 public static void change(int[] arr) { 14 for (int x = 0; x < arr.length; x++) { 15 //如果数组元素是偶数,值就变成了以前的2倍 16 if (arr[x] % 2 == 0) { 17 arr[x] *= 2; 18 } 19 } 20 } 21 }
九、方法的递归
其实就是方法自己调用自己
递归的前提:
1)定义的方法的调用次数不能太多,否则容易栈内存溢出错误
2)该方法必须要有一个结束条件
例如:求5的阶乘 5! = 5 * 4 * 3 * 2 * 1
1 public class Test10 { 2 3 public static void main(String[] args) { 4 int num = jc(5); 5 System.out.println(num); 6 } 7 8 // 1:出口条件 如果1 return 1 9 // 如果不是1 return num*方法名(num-1) 10 public static int jc(int num) { 11 if (num == 1) { 12 return 1; 13 } else { 14 return num * jc(num - 1); 15 } 16 } 17 }
例如:不死神兔(斐波那契数列),有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子涨到第三个月后每个月又生一堆兔子,假如兔子不死,问第二十个月的兔子对数是多少?
解法一:使用数组来做
1 package com.cnblogs; 2 3 public class Rabbit { 4 public static void main(String[] args) { 5 int[] arr = new int[20]; 6 //第一个月和第二个月的兔子对数 7 arr[0] = 1; 8 arr[1] = 1; 9 10 //从第三个月开始 11 for(int x = 2; x < arr.length; x++) { 12 arr[x] = arr[x - 1] + arr[x - 2]; 13 } 14 15 System.out.println("第二十个月的兔子对数时:" + arr[19]); 16 } 17 }
解法二:递归思想
1 public class Demo7 { 2 public static void main(String[] args) { 3 System.out.println(getCount(20)); 4 } 5 6 public static int getCount(int m) { 7 if(m == 1 || m == 2) { 8 return 1; 9 }else { 10 return getCount(m-1) + getCount(m-2); 11 } 12 } 13 }