Java方法的使用
1.方法的基本用法
1.1 什么是方法(method)
方法就是一个代码片段。类似于c语言中的"函数"
方法存在的意义(不要背, 重在体会):
1.是能够模块化的组织代码(当代码规模比较复杂的时候).
2.做到代码被重复使用, 一份代码可以在多个位置使用.
3.让代码更好理解更简单.
4.直接调用现有方法开发, 不必重复造轮子.
1.2 方法定义语法
基本语法:
// 方法定义 public static 方法返回值 方法名称([参数类型 形参 ...]){ 方法体代码; [return 返回值]; } // 方法调用 返回值变量 = 方法名称(实参...);
上面是方法的定义已经实现 实际上再Java里面 只有按值传递(不存在按地址传递)
代码示例: 实现一个方法实现两个整数相加
public class TestDemo1 { public static void main(String[] args) { int a = 10; int b = 20; // 方法的调用 int ret = add(a, b); System.out.println("ret = " + ret); } // 方法的定义 public static int add(int x, int y) { return x + y; } }
注意事项:
1.public 和 static 两个关键字在此处具有特定含义, 我们暂时不讨论, 后面会详细介绍.
2.方法定义时, 参数可以没有. 每个参数要指定类型
3.方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void
4.方法定义时的参数称为 “形参”, 方法调用时的参数称为 “实参”.
5.方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可.
6.Java 中没有 “函数声明” 这样的概念.
7.函数的返回值 支持链式调用
eg:System.out.println(sunAdd(10)*2);
1.3 方法调用的执行过程
基本规则:
定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
当方法被调用的时候, 会将实参赋值给形参.
参数传递完毕后, 就会执行到方法体代码.
当方法执行完毕之后(遇到 return 语句), 就执行完毕, 回到方法调用位置继续往下执行.
一个方法可以被多次调用.
代码示例1 计算两个整数相加
public static int add(int x, int y) { System.out.println("调用方法中 x = " + x + " y = " + y); return x + y; } public static void main(String[] args) { int a = 10; int b = 20; System.out.println("第一次调用方法之前"); int ret = add(a, b); System.out.println("第一次调用方法之后"); System.out.println("ret = " + ret); System.out.println("第二次调用方法之前"); ret = add(30, 50); System.out.println("第二次调用方法之后"); System.out.println("ret = " + ret); }
1.4 实参和形参的关系(重要)
代码示例: 交换两个整型变量
public class TestDemo1 { public static void swap(int a,int b){ int tmp = a; a = b; b = tmp; } public static void main(String[] args) { int a = 10; int b = 20; System.out.println("交换前:"+a+" "+b); System.out.println("交换后:"+a+" "+b); }
为什么没有交换?
答:因为这里我们实参传给形参交换了但实参没有交换 而我们打印的值是实参的值 所以导致实参结果本质上并为进行交换
但是在Java里面无法拿到栈上的值 我们现在可以先用数组来解决这个问题
class Test { public static void main(String[] args) { int[] arr = {10, 20}; swap(arr); System.out.println("a = " + arr[0] + " b = " + arr[1]); } public static void swap(int[] arr) { int tmp = arr[0]; arr[0] = arr[1]; arr[1] = tmp; } }
1.5 没有返回值的方法
方法的返回值是可选的. 有些时候可以没有的.
代码示例:
public class TestDemo1 { public static void swap(int[] arr) { int tmp = arr[0]; arr[0] = arr[1]; arr[1] = tmp; } public static void main(String[] args) { int[] arr = {10, 20}; swap(arr); System.out.println("a = " + arr[0] + " b = " + arr[1]); }
例如这段代码里面的方法就没有返回值
2.方法的重载
有些时候我们需要用一个函数同时兼容多种参数的情况, 我们就可以使用到方法重载.
2.1 重载要解决的问题
public class TestDemo1 { public static int add(int x, int y) { return x + y; } public static void main(String[] args) { int a = 10; int b = 20; int ret = add(a, b); System.out.println("ret = " + ret); double a2 = 10.5; double b2 = 20.5; double ret2 = add(a2, b2); System.out.println("ret2 = " + ret2); } }
由于参数类型不匹配, 所以不能直接使用现有的 add 方法.
因此我们要解决这个问题
2.2 使用重载
我们定义方法的名字可以一样 主要他们返回值个数不一样 类型不一样 他们就不会冲突 即可以定义多个名字一样的方法 但他们有些许差别
重载:
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
public static double add(double x, double y, double z) {
return x + y + z;
}
public class TestDemo1 { public static int add(int x, int y) { return x + y; } public static double add(double x, double y) { return x + y; } public static double add(double x, double y, double z) { return x + y + z; } public static void main(String[] args) { int a = 10; int b = 20; int ret = add(a, b); System.out.println("ret = " + ret); double a2 = 10.5; double b2 = 20.5; double ret2 = add(a2, b2); System.out.println("ret2 = " + ret2); double a3 = 10.5; double b3 = 10.5; double c3 = 20.5; double ret3 = add(a3, b3, c3); System.out.println("ret3 = " + ret3); } }
2.3 重载的规则
注意:也可以不是同一个类 继承关系上也可以用!
3.方法递归
3.1 递归的概念
一个方法在执行过程中调用自身, 就称为 “递归”.
递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.
3.2 递归执行过程分析
参照3.1中递归求n的阶乘 递归 的过程分析:
3.3 递归练习
代码示例: 递归求 N 的阶乘
import java.util.Scanner; public class TestDemo { public static int factor(int n){ if (n == 1){ return 1; } else { return n * factor(n-1); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(scanner.hasNextInt()){ int n = scanner.nextInt(); int ret = factor(n); System.out.println(ret); } } }
3.4 递归小结
递归是一种重要的编程解决问题的方式.
有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.
有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效.
4.作业
1.理解方法的基本用法, 方法重载, 方法递归, 并写一篇博客总结.
2.实现代码: 递归求 N 的阶乘
3.实现代码: 递归求 1 + 2 + 3 + … + 10
4.实现代码: 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
5.实现代码: 写一个递归方法,输入一个非负整数,返回组成它的数字之和.
6.实现代码: 求斐波那契数列的第 N 项
7.实现代码: 求解汉诺塔问题(提示, 使用递归)
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
用递归的方法来解答:
public class TestDemo1 { //汉诺塔问题: public static void move(char pos1,char pos2) { System.out.print(pos1+"->"+pos2+" "); }//移动盘子的函数书写 从pos1移动到pos2 /** * * @param n 代表你的盘子的个数 * @param pos1 盘子所在的起始位置 * @param pos2 盘子的中转位置 * @param pos3 盘子的结束位置 */ public static void hanio(int n,char pos1,char pos2,char pos3) { if (n == 1) { move(pos1,pos3); } else { hanio(n-1,pos1,pos3,pos2); move(pos1,pos3); hanio(n-1,pos2,pos1,pos3); } }//汉诺塔总移动逻辑的书写 public static void main(String[] args) { hanio(1,'A','B','C'); System.out.println(); hanio(2,'A','B','C'); System.out.println(); hanio(3,'A','B','C'); System.out.println(); } }
这里我们为大家举例分析汉诺塔,其他的代码请大家自行认真做!
8.实现代码: 青蛙跳台阶问题(提示, 使用递归)
一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法
5补充
1Java中用while循环来实现无限输入:
import java.util.Scanner; public class TestDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(scanner.hasNextInt()){ int n = scanner.nextInt(); } } }
感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘