Java|6 Java 方法

6.1 什么是方法
??我们日常说的方法是为获得某种东西或达到某种目的而采取的手段与行为方式。而现在说的方法有所不同,是具备特定功能的一段独立的代码段。
6.2 为什么要用方法
??举个例子,比如玩《刺激战场》游戏的时候,有个瞄准的动作需要 200 行代码实现,那么每次调用瞄准这个动作的时候,都要重复编写这 200 行代码,显然不合理,这样显得程序特别臃肿。而且这瞄准的动作出现问题时,就要到处修改这些代码。维护效率忒低,而且容易出现修改不全面的情况。Java 为我们提供了一种解决方案,将这 200 行代码放到一起,作为一个整体,其他地方需要调用的,直接调用这块代码即可。如下图所示:
Java|6 Java 方法
文章图片

6.3 标准的方法格式(注意格式的顺序)
??标准格式如下:
??修饰符 返回值类型 方法名(参数类型 1 参数名 1, 参数类型 2 参数名 2) {
????方法体;
????return 返回值;
??}

注意:在很多语言里面都有函数的定义,而函数在 Java 中被称为方法
6.3.1 没有返回值也没有方法参数 ??public void 方法名() {
???? 方法体;
??}
??例子:定义一个打印 20 行“I love Java”的方法并执行。
public static void main(String[] args) { prin(); }/** * 打印 */ public static void prin() { for(int i = 0; i < 20; i++) { System.out.println("I love Java"); } }

6.3.2 有返回值且有方法参数 ??public 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2) {
????方法体;
????return 返回值;
??}
??例子:计算任意两个整数的和,并将该结果进行返回。
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入任意两个整数求和(空格隔开):"); int num1 = scanner.nextInt(); int num2 = scanner.nextInt(); System.out.println(num1 + "与" +num2 + "和为:" + sum(num1, num2)); }/** * 求和 * @param num1 * @param num2 * @return */ public static int sum(int num1, int num2) { return num1 + num2; }

??写方法时要明确返回值类型,明确参数列表,定义方法名。
注意:
  • 方法不调用不执行;
  • 方法与方法是平级关系,不能嵌套定义;
  • 方法定义的时候参数之间用逗号隔开;
  • 方法调用的时候不用再写数据类型;
  • 如果方法有明确的返回值,一定要有 return 带回一个值;
  • 理解什么叫形参和什么叫实参
??例子: 打印一个高为 5 的直角三角形,要求可以通过方法参数的形式来控制打印的图形,比如是 * 或 $ 等等。
public static void main(String[] args) { System.out.println("请输入你要打印的直角三角形的符号(如 $):"); Scanner scanner = new Scanner(System.in); sum(scanner.next()); }/** * 打印特定符号直角三角形 * @param str 打印的符号 * @return */ public static void sum(String str) { for(int i = 0; i < 6; i++) { for(int j = 0; j < i; j++) { System.out.print(str); } System.out.println(); } }

6.4 方法的重载
??在同一个类中,方法名相同,参数列表不同的方法叫做方法的重载。比如:
  • 求两个整数的和
  • 求三个整数的和
  • 求四个整数的和
??以上三个方法的功能都是求和,所以类似这种一致的功能,若方法名不同,调用起来不方便,因此通常采用方法名相同,参数列表不同进行方法的重载。
注:
  • 重载与返回值无关,只与方法名和参数列表有关;
  • 在调用时,虚拟机通过参数列表的不同来区分同名方法。
  • 可变参数,后续讲解。
6.5 递归
??直接或间接调用函数本身,则该函数称为递归函数。例如:求 5!(提示:5!= 5 * 4 * 3 * 2 * 1 = 120)
??分析可得:
???? 5! = 5 * 4!
???? 4! = 4 * 3!
???? 3 != 3 * 2!
???? 2 != 2 * 1
??可以看出到了 1 就结束了,1 称为递归的出口。
实现步骤:
  • 首先定义一个方法
  • 找到出口条件
public static void main(String[] args) { System.out.println("请输入求阶乘的整数:"); Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); System.out.println(num + "! = " + factorial(num)); }/** * 求某个数的阶乘 * @param num * @return */ public static int factorial(int num) { if(num == 1) {// 出口条件 return num; } return num * factorial(num - 1); }

注:递归的优劣:
  • 优:
    • 1)代码简洁
    • 2)易于理解
  • 劣:
    • 1)时间和空间的消耗比较大。递归由于是函数调用自身,而函数的调用时消耗时间和空间的,每一次函数调用,都需要在内存栈中分配空间以保存参数,返回值和临时变量,而往栈中压入和弹出数据也都需要时间,所以降低了效率。
    • 2)重复计算。递归中又很多计算都是重复的,递归的本质时把一个问题分解成两个或多个小 问题,多个小问题存在重叠的部分,即存在重复计算,如斐波那契数列的递归实现。
    • 3)调用栈溢出。递归可能时调用栈溢出,每次调用时都会在内存栈中分配空间,而栈空间的容量是有限的,当调用的次数太多,就可能会超出栈的容量,进而造成调用栈溢出。
6.6 练习
  • 1)对两个整数变量的值进行互换(不需要第三方变量),请写出两种实现方式
注意:开发的时候还是推荐采用第三个变量的方式,可读性强
  • 2)设计一个方法来计算 n + (n - 1) + (n - 2) + … + 3 + 2 + 1 的值。其中 n 的值由用户输入,如果输入的数是8,则计算 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 的值,计算结果应该是 36。
  • 3)编写一个程序,让用户输入一个三位数的正整数值,然后计算该数各位数的和,
    例如:如果输入的数是 123,则计算结果是 6。
可到牛客网做练习。
【Java|6 Java 方法】至此,Java 方法已经基本掌握,接下来请看《7 IntelliJ IDEA 的安装与使用》

    推荐阅读