模块六. 方法
第一章. 方法的使用
1. 方法介绍以及简单的方法定义
1. 介绍方法定义
1. 问题描述: 之前所有的代码都在main方法中,如果我们将来所有功能的代码都放到main方法中,会显得main方法代码太多太乱太臃肿,不好维护 解决:将不同功能的代码放到不同的方法中,像执行某个功能,直接调用方法名就行了, 对应的代码就自动执行起来了,将来维护的时候,直接找到对应的方法,就可以对其直接修改维护 2. 方法: 拥有功能性代码的代码块 将/*不同的功能放在不同的方法*/中,给每个方法取个名字,直接调用方法名,对应的方 法就执行起来了,好维护 3. 通用定义格式: 修饰符 返回值类型 方法名(参数){ 方法体 return 结果 }
代码示例
public class Demo01Method { public static void main(String[] args){ farmer(); cook(); me(); } // 农民伯伯 public static void farmer(){ System.out.println("播种"); System.out.println("施肥"); System.out.println("拔草"); System.out.println("浇水"); System.out.println("除虫"); System.out.println("收割"); } //厨师 public static void cook(){ System.out.println("洗菜"); System.out.println("切菜"); System.out.println("炒菜"); System.out.println("装盘"); System.out.println("上菜"); } //我们自己 public static void me(){ System.out.println("洗手"); System.out.println("吃菜"); } }
2. 方法定义各部分解释
1. 通用格式定义方法: 修饰符 返回值类型 方法名(参数){ 方法体 return 结果 } 2. 各部分解释: a. 修饰符: public :公共的访问权限,在哪都能调用 static : 静态的 修饰符不分顺序,谁前谁后都行 b. 返回值类型: 该方法最终返回的结果的数据类型 比如: return 1 -> 方法上返回值类型写 int return 2.5 -> 方法上返回值类型写 double return "" -> 方法上返回值类型写 String 如果没有返回值,不要写具体的返回值类型了,要写 void c. 方法名:见名之意(小驼峰式) d. 参数:进入到方法内部参与执行的数据(数据类型 变量名,数据类型 变量名) e. 方法体:实现该方法的具体代码 f. return 结果:如果有返回值,可以利用 return 将结果返回
2. 无参数无返回值的方法定义和执行流程
1. 定义以及调用格式
1. 通过通用格式,分成/**四种方法**/来学习: a. 无参无返回值方法 b. 有参无返回值方法 c. 无参有返回值方法 d. 有参有返回值方法 2. 调用: 无返回值的方法调用都是直接调用 有返回值的方法调用: 打印调用 赋值调用(推荐)
1. 无参无返回值方法定义: public static void 方法名(){ 方法体 //实现此方法的具体代码 } 2. 调用: 在其他方法中: 方法名(); 3. 注意事项: a. void 关键字代表无返回值,写了 void ,就不要在方法中写 return 结果 b. 方法不调用不执行, main 方法归虚拟机调用 c. 方法之间是/*平级关系,不能嵌套*/ d. 方法的/*执行顺序只和调用顺序有关*/,和定义顺序无关
代码示例
public class Demo01Method { public static void main(String[] args){ farmer(); cook(); me(); } // 农民伯伯 public static void farmer(){ System.out.println("播种"); System.out.println("施肥"); System.out.println("拔草"); System.out.println("浇水"); System.out.println("除虫"); System.out.println("收割"); } //厨师 public static void cook(){ System.out.println("洗菜"); System.out.println("切菜"); System.out.println("炒菜"); System.out.println("装盘"); System.out.println("上菜"); } //我们自己 public static void me(){ System.out.println("洗手"); System.out.println("吃菜"); } }
练习
//定义一个方法,实现两个整数相加 public class Demo02Method { public static void main(String[] args) { add(); } //定义一个方法,实现两个整数相加 //无参无返回值方法 public static void add(){ int a = 10; int b = 20; int sum = a + b; System.out.println("sum = " + sum); } }
2. 执行流程
3. 有参数无返回值的方法定义和执行流程
1. 定义以及调用格式
1. 格式: public static void 方法名(数据类型 变量名){ 方法体 } 2. 调用: 方法名(具体的值) -> 调用的时候要给参数赋值
代码示例
//需求:定义一个方法,实现两个整数相加 public class Demo03Method { public static void main(String[] args) { sum(15,20); } public static void sum(int a,int b){ //方法名可以和变量名重复 int sum = a + b; System.out.println(sum); } }
2. 执行流程
4. 无参数有返回值的方法定义和执行流程
1. 定义以及调用
1. 格式: public static 返回值类型 方法名(){ 方法体 return 结果 } 2. 调用: 返回值返回给了谁?哪里 调用返回给哪里 a. 打印调用: sout(方法名()) -> 不推荐 b. /*赋值调用*/:调用完之后用一个变量接受返回值结果 -> 极力推荐 数据类型 变量名 = 方法名()
代码示例
//需求:定义一个方法,实现两个整数相加,将结果返回 public class Demo04Method { public static void main(String[] args) { //打印调用 - > 不推荐 System.out.println(sum()); //赋值调用 -> 极力推荐 int result = sum(); System.out.println("result = " + result); } public static int sum(){ int a = 10; int b = 20; // return a + b; int sum = a + b; return sum; } }
2. 执行流程
5. 有参数有返回值的方法定义和执行流程
1. 定义以及调用
1. 格式: public static 返回值类型 方法名(参数){ 方法体 return 结果 } 2. 调用: a. 打印调用 sout(方法名(具体的值)) b. 赋值调用 -> 极力推荐 数据类型 变量名 = 方法名(具体的值)
代码示例
//需求:定义一个方法,实现两个整数相加,将结果返回 public class Demo05Method { public static void main(String[] args) { int result = sum(10, 20); System.out.println(result); } public static int sum(int a,int b){ int sum = a + b; return sum; } }
2. 执行流程
6. 形式参数和实际参数
1. 形式参数(形参):在/*定义*/方法的时候形式上定义的参数,此参数还/*没有赋值*/ 2. 实际参数(实参):在/*调用*/方法的时候给形参赋予的具体的值,此参数/*被赋值*/
7. 参数和返回值使用的时机
1. 参数:什么时候需要参数? 当想将方法A(比如main方法)的数据传递到方法B(比如定义了一个实现加法的方法),那么定义方法B时就需要带个参数,在方法A中调用方法B时,可以将方法A中的数据通过参 数传递到方法B中 2. 返回值:什么时候需要有返回值? 调用方法C时,想要方法C的结果,去参与其他的操作,那么方法C就需要将自己的结果返回 3. 总之,看需求决定是否需要参数和返回值
举例
Controller接收的请求的参数需要一层一层传递到service层,service层需要将请求参数再传递到dao层,此时service的方法以及dao的方法都需要参数来接收 dao层的结果需要传递给service层,service再传递给Controller层,此时dao层和service方法需要返回值
8. 变量作为实参使用
练习
//需求:定义一个方法,比较两个整数的大小,如果第一个比第二个大,返回true,否则返回 false import java.util.Scanner; public class Demo07Method { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); boolean result = compare(a, b); //传递的是变量a,b,但我们真正传递的是a,b代表的数据,不是变量本身,此时变 量作为实参使用 System.out.println(result); } public static boolean compare(int a,int b){ // if(a > b){ // return true; // }else { // return false; // } return a > b ? true : false; } }
第二章. 方法注意事项终极版
1. 方法
方法不调用不执行
方法的执行顺序只和调用顺序有关
方法之间不能互相嵌套
void 不能和[return 结果]共存,但是void 能和 [return] 共存
a. void:代表没有返回值
b. return 结果:就代表有返回值了
先将结果返回,然后结束方法
c. return : 仅仅代表结束方法,不代表有返回值一个方法中不能连续写多个return():{一个方法不能有多个返回值}
调用方法的时候要看看下面有没有这个方法
1. 方法不调用不执行 2. 方法的执行顺序只和调用顺序有关 3. 方法之间不能互相嵌套 4. void 不能和[return 结果]共存,但是void 能和 [return] 共存 a. void:代表没有返回值 b. return 结果:就代表有返回值了 先将结果返回,然后结束方法 c. return : 仅仅代表结束方法,不代表有返回值 5. 一个方法中不能连续写多个return():{一个方法不能有多个返回值} 6. 调用方法的时候要看看下面有没有这个方法
代码演示
public class Demo08Method { public static void main(String[] args){ System.out.println("Hello World !"); method1(); // method04(); //没定义这个方法,不能调用 } public static int method1(){ return 1; // return 结果; 代表有返回值 } public static void method2(){ return ;//仅仅代表结束方法,不代表有返回值 } }
初学者怎么写: 1. 先定义,再调用 2. 如果是没有返回值的方法,直接在被调用的方法内部输出结果 3. 如果是带返回值的方法,就调用完毕之后,用一个变量去接收结果,输出这个变量 4. 调用方法: 直接调用:方法名() 方法名(实参) - > 只针对于无返回值的方法 打印调用:sout(方法名{}) 或者 sout(方法名{实参})-> 不推荐使用 赋值调用:数据类型 变量名 = 方法名() 或者 数据类型 变量名 = 方法名(实参) -> 针对于有返回值的方法 -> 推荐使用
怎么练习: 1. 如果定义的方法没有返回值,写个void 不要写return 结果 2. 如果定义的方法有返回值,就将void 改成具体的返回值类型,在方法体中最后写一 个 return 结果,将结果返回 3. 如果方法有返回值,调用的时候推荐使用赋值调用,如果没有返回值,使用直接调用 4. 练习的时候,只需要完成一个简单的需求(比如:两整数相加),针对此需求,定义4 种方法,并成功调用
第三章. 方法练习
需求: 1. 键盘录入一个整数,将整数传递到另外一个方法中,在此方法中判断这个整数的奇偶性, 如果是偶数,则返回“偶数”,否则返回“奇数”。 2. 求出1-100的和,并将结果返回。 3. 定义一个方法,给这个方法传几,就让这个方法循环打印几次“我是一个有经验的Java开发工程师”
4. 在main方法发中定义一个数组,将数组传递到另外一个方法中,在此方法中遍历数组
数组本身是引用数据类型,引用数据类型做方法参数传递,传递的是地址值
5. 数组作为返回值返回
public class Demo02Method { public static void main(String[] args) { int[] method = method(); System.out.println(method);//地址值 for (int i = 0; i < method.length; i++) { System.out.println(method[i]); } } public static int[] method(){ int a = 10; int b = 20; int sum = a + b; int sub = a - b; int[] arr1 = {sum,sub}; return arr1;//返回的是一个int[] ,那么返回值类型也应该是int[] } }
返回值是引用数据类型时,返回的是地址值
第四章. 方法的重载
1. 概述:方法名相同,参数列表不同的方法 2. 什么叫参数列表不同: a. 参数个数不同 b. 参数类型不同 c. 参数类型顺序不同 3. 判断两个方法是否为重载方法,和什么无关: a. 和参数名无关 b. 和返回值无关
public class Demo02OverLoad { public static void main(String[] args) { } public static void open(){ } public static void open(int a){ } public static void open(int a,int b){ } public static void open(double a, int b){ } public static void open(int a, double b){ } // public void open(int i,double b){} public static void OPEN(){} // public static void open(int i,int j){}
如果定义方法功能一样(比如都是相加),只不过实现细节不一样(三个整数相加,四个小小数相加),就可以考虑定义成重载的方法