【Java从入门到大牛】方法详解 矫情吗;* 2024-04-26 02:39 78阅读 0赞 > ? 本文由 [程序喵正在路上][Link 1] 原创,CSDN首发! > ? 系列专栏:[Java从入门到大牛][Java] > ? 首发时间:2023年7月9日 > ? 欢迎关注?点赞?收藏?留言? > ? 一以贯之的努力 不得懈怠的人生 #### 目录 #### * 方法简介 * 方法的其他形式 * 方法使用时的常见问题 * 方法的案例 * * 计算1-n的和 * 判断一个整数的奇偶 * 方法在计算机中的执行原理 * Java的参数传递机制 * * 基本类型的参数传递 * 引用类型的参数传递 * 案例:比较数组 * 案例:从数据中查询指定元素的索引 * 方法重载 * 补充知识:方法中单独使用 return 关键字 ## 方法简介 ## **什么是方法** 方法是一种语法结构,它可以把一段代码封装成一个功能,以便我们重复调用 **方法的完整格式** 修饰符 返回值类型 方法名(形参列表) { 方法体代码(需要执行的功能代码) return 返回值; } 示例:写一个方法,功能为对 2 个整数求和并返回 public static int sum(int a, int b) { int c = a + b; return c; } **方法如何执行 ?** 方法定义之后,必须要调用才可以跑起来,调用格式为 `方法名(参数列表);` int rs = sum(10, 20); System.out.println(rs); **方法定义时的几个注意点** * 方法的修饰符:暂时都使用 `public static` 来修饰 * 方法申明了具体的返回值类型,内部就必须使用 `return` 来返回对应类型的数据 * 形参列表可以有多个,甚至可以没有;如果有多个形参,形参之间必须用逗号隔开,且不能给初始化值 **使用方法的好处** * 提高了代码的复用性,提高了开发效率 * 让程序的逻辑更加清晰 ## 方法的其他形式 ## 方法定义时,需要按照方法解决的实际业务需求,来设计合理的方法形式解决问题 **注意事项** * 如果方法不需要返回数据,则返回值类型必须申明成 `void`(无返回值申明),此时方法内部不可以再使用 `return` 返回数据 * 方法如果不需要接受数据,则不需要定义形参,且调用方法时也不可以再传数据给方法了 * 没有参数,且没有返回值类型(void)申明的方法,称为无参数、无返回值的方法,依次类推 ## 方法使用时的常见问题 ## * 方法在类中的位置无所谓,但一个方法不能定义再另一个方法里面 * 方法的返回值类型写 void 时,方法内不能使用 return 返回数据,如果方法的返回值类型写了具体类型,方法内部则必须使用 return 返回对应类型的数据 * return 语句的下面,不能再编写代码,属于无效的代码,因为执行不到这里 * 方法不调用就不会执行,调用方法时,传给方法的数据,就必须严格匹配方法的参数情况 * 调用有返回值的方法,有 3 种方式:1、可以定义变量接收结果;2、或者直接输出调用;3、甚至直接调用 * 调用无返回值的方法,只有 1 种方式:1、只能直接调用 ## 方法的案例 ## 设计方法时,主要关注三个方面: 1. 方法是否需要接收数据进行处理 ? 2. 方法是否需要返回数据 ? 3. 方法要处理的业务是什么 ? ### 计算1-n的和 ### **需求** 求 1-n 的和 **分析** 1. 方法需要接收 n 具体的值,因此形参声明为:int n 2. 方法需要返回 1-n 的求和结果,因此返回值类型声明为 int 3. 方法内部的业务:求出 1-n 的和并返回 **代码示例** public static int cal(int n) { int sum = 0; // 保存求和的结果 // 求和 for (int i = 1; i <= n; i++) { sum += i; } return sum; // 返回求和结果 } ### 判断一个整数的奇偶 ### **需求** 判断一个整数的奇偶,并把判断的结果输出出来 **分析** 1. 方法需要接收一个整数来进行判断,因此形参声明为:int number 2. 方法内部判断完后直接输出结果即可,无需返回,因此返回值类型声明为 void 3. 方法内部的业务:通过 if 语句判断 number 是奇数还是偶数,并输出结果 **代码示例** public static void judgeNumber(int number) { if (number % 2 == 0) { System.out.println(number + "是偶数"); } else { System.out.println(number + "是奇数"); } } ## 方法在计算机中的执行原理 ## 方法被调用的时候,是进入到栈内存中运行,而栈的特点是先进后出 ![在这里插入图片描述][77a588126db64368bc5419b52a08bf1a.png] ## Java的参数传递机制 ## **Java 的参数传递机制都是值传递** * 所谓值传递:指的是在传输实参给方法的形参的时候,传输的是实参变量中存储的值的副本 * 实参:在方法内部定义的变量 * 形参:定义方法时声明的参数列表 ### 基本类型的参数传递 ### ![在这里插入图片描述][8884f21a552c4ca1a2f09efef6ef8a2c.png] 从上图中可以看出,因为传递过去的只是值的副本,所以在 change 方法内部对 a 的修改并不会影响主方法里 a 的值 ### 引用类型的参数传递 ### ![在这里插入图片描述][0c71a85cadd146e7afae895a7badf7a5.png] 从上图中可以看出,引用类型的参数传递传输的是存储的地址值,所以在 change 方法内部对数组 arrs 的修改相当于直接对主方法里的数组进行修改 ### 案例:比较数组 ### **需求** 如果两个 int 类型的数组,元素个数和对应位置的元素内容都是一样的,则认为这 2 个数组是一模一样的 **分析** 1. 该方法需要接收两个 int 类型的数组,因此形参声明为 `int[] arr1, int[] arr2` 2. 该方法判断完需要返回:true 或 false,因此返回值类型声明为 boolean 类型 3. 该方法内部的业务:判断两个数组内容是否一样 **代码示例** public class Test { public static void main(String[] args) { int[] arr1 = { 10, 20, 30}; int[] arr2 = { 10, 20, 30}; if (compareArray(arr1, arr2)) { System.out.println("arr1和arr2一样"); } else { System.out.println("arr1和arr2不一样"); } int[] arr3 = { 10, 40, 30}; if (compareArray(arr1, arr3)) { System.out.println("arr1和arr3一样"); } else { System.out.println("arr1和arr3不一样"); } } // 判断两个数组是否一样 public static boolean compareArray(int[] arr1, int[] arr2) { // 判断两个数组长度是否一致 if (arr1.length != arr2.length) { return false; } for (int i = 0; i < arr1.length; i++) { if (arr1[i] != arr2[i]) { // 有一个元素不一样就返回false return false; } } // 程序如果能执行到这里,说明两个数组一样 return true; } } **运行结果** ![在这里插入图片描述][435c2bf6f9584f03afcdc8c5417709c3.png] ### 案例:从数据中查询指定元素的索引 ### **需求** 设计一个方法可以接收数组和要查询的元素值,最终要返回元素在该数组中的索引,如果数组不存在该元素则返回 -1 **分析** 1. 该方法需要接收一个数组和一个数值,因此形参声明为 `int[] arr, int digit` 2. 该方法需要返回元素值所在的索引值或者 -1,因此返回值类型声明为 int 3. 该方法内部的业务:遍历数组,逐个与传入元素比对 **代码示例** public class Test { public static void main(String[] args) { int[] arr = { 43, 65, 35, 39, 48, 29}; System.out.println("39的索引为" + queryIndex(arr, 39)); System.out.println("99的索引为" + queryIndex(arr, 99)); } // 从数组中查询指定元素的索引 public static int queryIndex(int[] arr, int digit) { for (int i = 0; i < arr.length; i++) { if (arr[i] == digit) { return i; } } return -1; } } **运行结果** ![在这里插入图片描述][cbeda85c6748448b89cdf5fcbc46bcd7.png] ## 方法重载 ## **什么是方法重载** 一个类中,出现多个方法的名称相同,但是它们的形参列表是不同的,那么这些方法就称为方法重载了 **方法重载的注意事项** * 一个类中,只要一些方法的名称相同、形参列表不同,那么它们就是方法重载了,其它的都不管 * 形参列表不同指的是:形参的个数、类型或顺序不同,不关心形参的名称 **方法重载的应用场景** 开发中我们经常需要为处理一类业务,提供多种解决方案,此时用方法重载来设计是很专业的 **方法重载案例** 开发一个武器系统,功能需求如下 1. 可以默认发射一枚武器 2. 可以指定地区发射一枚武器 3. 可以指定地区发射多枚武器 **代码示例** public class Test { public static void main(String[] args) { fire(); fire("米国"); fire("岛国", 1000); } // 默认发射一枚武器 public static void fire() { System.out.println("默认发射一枚武器给米国!"); } // 指定地区发射一枚武器 public static void fire(String location) { System.out.println("给" + location + "发射一枚武器"); } // 指定地区发射多枚武器 public static void fire(String location, int nums) { System.out.println("给" + location + "发射" + nums + "枚武器"); } } **运行结果** ![在这里插入图片描述][be82c6282a77471aa7040f39eca8c826.png] ## 补充知识:方法中单独使用 return 关键字 ## `return;` 可以用在无返回值的方法中,其作用是:立即跳出并结束当前方法的执行 **代码示例** public class Test { public static void main(String[] args) { divide(10, 0); } // 进行除法运算 public static void divide(int a, int b) { if (b == 0) { System.out.println("您的数据有误!!不执行!!"); return; // 直接跳出并结束当前divide方法的执行 } int c = a / b; System.out.println("除法结果是: " + c); } } **运行结果** ![在这里插入图片描述][407a7efa45904e859c3dc0aa457d7098.png] [Link 1]: https://blog.csdn.net/weixin_62511863?spm=1011.2421.3001.5343 [Java]: https://blog.csdn.net/weixin_62511863/category_12365679.html?spm=1001.2014.3001.5482 [77a588126db64368bc5419b52a08bf1a.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/877e59fa1c7e49edb95c57be39149e3d.png [8884f21a552c4ca1a2f09efef6ef8a2c.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/05456eaad75245b1990cb685e6a98bfc.png [0c71a85cadd146e7afae895a7badf7a5.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/2f2bfe0f96654f8480973e8fe40088ce.png [435c2bf6f9584f03afcdc8c5417709c3.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/44a63e7ac07a489383085670a3bf669d.png [cbeda85c6748448b89cdf5fcbc46bcd7.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/f89a1244cc2d43878687e0b15fb9a382.png [be82c6282a77471aa7040f39eca8c826.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/64deee7f582a4407bc9904fd9639f82a.png [407a7efa45904e859c3dc0aa457d7098.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/26/3a9b5e29b7d4485184fc4bc10303044b.png
相关 【Java从入门到大牛】Java高级技术 注解(Annotation)就是 Java 代码里的特殊标记,比如:@Override、@Test 等,作用是:让其他程序根据注解信息来决定怎么执行该程序自定义注解,就是... 忘是亡心i/ 2024年04月26日 02:57/ 0 赞/ 75 阅读
相关 【Java从入门到大牛】多线程 什么是线程安全问题?多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题取钱的线程安全问题场景:小明和小红是一对夫妻,他们有一个共同的账户,余额是10万元,如果... 谁借莪1个温暖的怀抱¢/ 2024年04月26日 02:55/ 0 赞/ 66 阅读
相关 【Java从入门到大牛】编程思维训练 本文讲解了几个小案例,巩固了之前学习Java的一些基础知识,同时积累了一定的代码量 本是古典 何须时尚/ 2024年04月26日 02:40/ 0 赞/ 74 阅读
还没有评论,来说两句吧...