一、什么是方法
1. 定义
方法是程序中最小的执行单元
2. 需求
重复的代码、具有独立功能的代码可以抽取到方法中
3. 好处
① 可以提高代码的复用性
② 可以提高代码的可维护性
二、最简单的方法定义和调用
1. 方法的格式
① 方法定义:把一些代码打包在一起,该过程就称为方法定义
② 方法调用:方法定义后并不是直接运行的,需要手动调用才能执行,该过程称为方法调用
2. 最简单的方法定义和调用
① 格式:
public static void 方法名(){ 方法体(就是打包起来的代码); }
② 范例
public static void playGame(){ 七个打印语句; }
③ 注意:方法必须先定义后调用,否则程序将报错
3. 样例
package com.itheima.methoddemo; public class MethodDemo1{ public static void main(String[] args){ //目标:掌握最简单的方法定义和调用的格式 //调用方法 playGame(); } //定义一个方法 public static void playGame(){ System.out.println("选人物"); System.out.println("准备开局"); System.out.println("对线"); System.out.println("崩盘"); System.out.println("骂队友"); System.out.println("送人头"); System.out.println("GG"); } }
package com.itheima.methoddemo; public class MethodDemo2{ public static void main(String[] args){ //目标:利用方法最简单的格式完成当前练习 //调用方法 printGFInfo(); } public static void printGFInfo(){ System.out.println("小惠惠"); System.out.println("萌妹子"); System.out.println("18岁"); } }
package com.itheima.methoddemo; public class MethodDemo3{ public static void main(String[] args){ //目标:利用方法最简单的格式完成当前练习 //需求:在方法里面定义两个变量并求和打印 getSum(); } public static void getSum(){ int num1 = 10; int num2 = 20; int result = num1 + num2; System.out.println(result); } }
三、带参数的方法定义和调用
1. 带参数方法的定义
① 单个参数
格式
public static void 方法名(参数){……}
范例
public static void method(int number){……}
② 多个参数
格式
public static void 方法名(参数1,参数2,……){……}
范例
public static void getSum(int number1,int number2){……}
2. 带参数方法的调用
① 单个参数:方法名(参数);
范例1:method(10); 范例2:method(变量);
② 多个参数:方法名(参数1,参数2,……);
范例1:getSum(10,20); 范例2:getSum(变量1,变量2);
3. 样例
package com.itheima.methoddemo; public class MethodDemo4{ public static void main(String[] args){ //目标:掌握带参数方法定义的格式和调用的格式 getSum(10,20); } public static void getSum(int num1, int num2){ int result = num1 + num2; System.out.println(result); } }
4. 形参和实参
① 形参:全称形式参数,是指方法定义中的参数
② 实参:全称实际参数,方法调用中的参数
③ 注意:方法调用时,形参和实参必须一一对应,否则程序将报错
5. 练习
package com.itheima.test; public class Test1{ public static void main(String[] args){ //需求:定义一个方法,求长方形的周长,将结果在方法中进行打印 //目标:根据不同的需求,选择定义无参的方法,还是带参的方法 getLength(5.2,1.3); } //1.我要干嘛?求长方形的周长 //2.我干这件事情,需要什么才能完成?长 宽 public static void getLength(double len, double width){ double result = (len + width) * 2; System.out.println(result); } }
package com.itheima.test; public class Test2{ public static void main(String[] args){ //需求:定义一个方法,求圆的面积,将结果在方法中进行打印 //目标:根据不同的需求,选择定义无参的方法,还是带参的方法 getArea(1.5); } //1.我要干嘛?求圆的面积 //2.我干这件事情,需要什么才能完成?半径的平方 public static void getArea(double radius){ double result = radius * radius * 3.14; System.out.println(result); } }
四、带返回值方法的定义和调用
1. 带返回值方法的定义
① 格式
public static 返回值类型 方法名(参数){ 方法体; return 返回值; }
② 范例
public static int getSum(int a,int b){ int c = a + b; return c; }
2. 带返回值方法的调用
① 直接调用:方法名(实参);
② 赋值调用:整数类型 变量名 = 方法名(实参);
③ 输出调用:System.out.println(方法名(实参));
3. 样例
package com.itheima.methoddemo; public class MethodDemo5{ public static void main(String[] args){ //目标:掌握带返回值方法的定义和调用格式 //直接调用 getSum(10,20,30); //赋值调用 int sum = getSum(10,20,30); System.out.println(sum); //输出调用 System.out.println(getSum(10,20,30)); //先计算第一个季度的营业额 int sum1 = getSum(10,20,30); //再来计算第二个季度的营业额 int sum2 = getSum(20,30,40); //再来计算第三个季度的营业额 int sum3 = getSum(20,30,40); //再来计算第四个季度的营业额 int sum4 = getSum(20,30,40); //求全年的总营业额 int sum = sum1 + sum2 + sum3 +sum4; System.out.println(sum); } public static void getSum(int num1,int num2,int num3){ int result = num1 + num2 + num3; return result;//返回给方法的调用处 } }
4. 总结
① 什么时候用到有返回值的方法?
在调用处要根据方法的结果,去编写另一段代码
② 有返回值方法的定义格式
public static 返回值类型 方法名(参数){ 方法体; return 返回值; }
③ 有返回值方法的调用格式
直接调用,赋值调用,输出调用
④ 有返回值方法中参数的运行过程
5. 练习
package com.itheima.test; public class Test3{ public static void main(String[] args){ //目标:要能区分出什么时候使用带返回值的方法 //需求:定义方法,比较两个长方形的面积 //调用方法获取长方形的面积,再进行比较 double area1 = getArea(5.3,1.7); double area2 = getArea(2.4,2.7); if(area1 > area2){ System.out.println("第一个长方形更大"); }else{ System.out.println("第二个长方形更大"); } } //定义一个方法来求长方形的面积 //1.我要干嘛?求长方形的面积 //2.需要什么?长 和 宽 //3.方法的调用处,是否需要继续使用方法的结果 //如果要用,那么方法必须有返回值 //如果不要用,方法可以写返回值,也可以不写返回值 public static double getArea(double len, double width){ double area = len * width; return area; } //在以后实际开发当中,我们一般是把重复的代码或者具有独立功能的代码抽取到方法当中 //以后我们直接调用就可以了 //1.我要干嘛?比较两个长方形的面积 //2.需要什么?两个长 两个宽 public static void compare(double len1, double width1, double len2, double width2){ double area1 = len1 * width1; double area2 = len2 * width2; if(area1 > area2){ System.out.println("第一个长方形更大"); }else{ System.out.println("第二个长方形更大"); } } }
五、方法的小结
1. 方法的注意事项
① 方法不调用就不执行
② 方法与方法之间是平级关系,不能互相嵌套定义
③ 方法的编写顺序和执行顺序无关
④ 方法的返回类型为void,表示该方法没有返回值
没有返回值的方法可以省略return语句不写
如果要编写return,后面不能跟具体的数据
⑤ return语句下面,不能编写代码,因为永远执行不到,属于无效代码
2. return 关键字
① 方法没有返回值:可以省略不写。如果书写,表示结束方法
② 方法有返回值:必须要写。表示结束方法和返回结果
六、方法的重载
1. 方法的重载
① 在同一个类中,定义了多个同名的方法,这些同名的方法具有同种功能
② 每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系
③ 简单记:同一个类中,方法名相同,参数不同的方法。与返回值无关。
参数不同:个数不同、类型不同、顺序不同
④ Java虚拟机会通过参数的不同来区分同名的方法
2. 练习
package com.itheima.test; public class Test4{ public static void main(String[] args){ /* 需求: 使用方法重载的思想,设计比较两个整数是否相同的方法 要求: 兼容全整数类型(byte,short,int,long) */ //调用 //compare(10,20); //compare((byte)10,(byte)20); byte b1 = 10; byte b2 = 20; compare(b1,b2); } //会把相同功能的方法名起成一样的名字 //好处1:定义方法的时候可以不用那么多的单词了 //好处2:调用方法的时候也不需要那么麻烦了 public static void compare(byte b1,byte b2){ System.out.println("byte"); System.out.println(b1 == b2); } public static void compare(short s1,byte s2){ System.out.println("short"); System.out.println(s1 == s2); } public static void compare(int i1,int i2){ System.out.println("int"); System.out.println(i1 == i2); } public static void compare(long n1,long n2){ System.out.println("long"); System.out.println(n1 == n2); } }
七、方法的三个练习:遍历求最大值和判断是否存在
1. 数组遍历
package com.itheima.test; public class Test5{ public static void main(String[] args){ //1.定义数组 int[] arr = {11, 22, 33, 44, 55}; //2.调用方法遍历数组 printArr(arr); /* System.out.println("abc");//先打印abc,再进行换行 System.out.print("abc");//只打印abc,不换行 System.out.print("bcd"); System.out.println();//不打印任何数据,只做换行处理 } */ //定义方法用于数组的遍历 //1.我要干嘛? 遍历数组 //2.我干这件事情需要什么才能完成? 数组 //3.方法的调用处是否需要继续使用结果? 不需要返回值 public static void printArr(int[] arr){ System.out.print("["); for(int i = 0; i < arr.length; i++){ if(i == arr.length - 1){ System.out.print(arr[i]); }else{ System.out.println(arr[i]+", "); } } System.out.println("]"); } }
2. 数组最大值
package com.itheima.test; public class Test6{ public static void main(String[] args){ //1.定义数组 int[] arr = {1, 5, 7, 3, 8, 10}; //2.调用方法求最大值 int max = getMax(arr); //3.打印 System.out.println(max); } //1.我要干嘛? 求最大值 //2.我干这件事情,需要什么才能完成? 数组 //3.是否返回? 返回 public static int getMax(int[] arr){ int max = arr[0]; for(int i = 1; i < arr.length; i++){ if(arr[i] > max){ max = arr[i]; } } return max; } }
3. 判断是否存在
package com.itheima.test; public class Test7{ public static void main(String[] args){ //1.定义数组 int[] arr = {1, 5, 8, 12, 56, 89, 34, 67}; //2.判断一个数字在数组中是否存在了 boolean flag = contains(arr, 89); System.out.println(flag); } //1.我要干嘛?判断数字在数组中是否存在 //2.我干这件事情,需要什么才能完成? 数组 数字 //3.调用处是否需要继续使用结果? 返回 true false public static boolean contains(int[] arr, int number){ for (int i = 0; i < arr.length; i++){ if(arr[i] == number){ return true; } //什么时候才能断定89,在数字中是不存在的 //当数组里面所有的数据全部比较完毕之后,才能断定 return false; } } } //return break关键字的区别 //return:其实跟循环没有什么关系,跟方法有关,表示1结束方法 2返回结果 // 如果方法执行到了return,那么整个方法全部结束,里面的循环也会随之结束了 //break关键字 //其实跟方法没有什么关系,结束循环或者switch的
八、方法练习-拷贝数据
package com.itheima.test; public class Test8{ public static void main(String[] args){ /* 需求: 定义一个方法copyOfRange(int[] arr,int from,int to) 功能: 到数组arr中从索引from(包含from)开始 到索引to结束(不包含to)的元素复制到新数组中 将新数组返回 */ //1.定义原始数组 int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}; //2.调用方法拷贝数据 int[] copyArr = copyOfRange(arr, 3, 7); //3.遍历copyArr for(int i = 0; i < copyArr.lenght; i++){ System.out.print(copyArr[i] + " "); } } public static int[] copyOfRange(int[] arr,int from,int to){ //1.定义数组 int[] newArr = new int[to - from]; //2.把原始数组arr中的from到to上对应的元素,直接拷贝到newArr中 //伪造索引的思想 int index = 0; for(int i = from; i < to; i++){ //格式:数组名[索引] = 数据值; newArr[index] = arr[i]; index++; } //3.把新数组返回 return newArr; } }
九、方法的基本内存原理
1. 方法调用的基本内存原理
2. 方法传递基本数据类型的内存原理
3. 方法传递引用数据类型的内存原理
十、什么是基本数据类型和引用数据类型
1. 基本数据类型
① 整数类型
② 浮点数类型
③ 布尔类型
④ 字符类型
2. 引用数据类型
除了上边的其他所有类型
3. 从内存的角度去解释
① 基本数据类型:数据值是存储在自己的空间中
特点:赋值给其他变量,也是赋的真实的值
② 引用数据类型:数据值是存储在其他空间中,自己空间中存储的是地址值
特点:赋值给其他变量,赋的地址值
十一、方法的值传递
1. 方法传递基本数据类型的内存原理
① 传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值
② 传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值
2. 练习
package com.itheima.test; public class Test9{ public static void main(String[] args){ int number = 100; System.out.println("调用change方法前:" + number);//100 change(number); System.out.println("调用change方法后:" + number);//100 } public static void change(int number){ number = 200; } }
package com.itheima.test; public class Test10{ public static void main(String[] args){ int[] arr = {10, 20, 30}; System.out.println("调用change方法前:" + arr[1]);//20 change(arr); System.out.println("调用change方法后:" + arr[1]);//200 } public static void change(int number){ arr[1] = 200; } }