Java基础10-方法的重载与递归
一、方法的重载
1.为什么要重载?
首先我们先来看不同数据类型求和的需求
public static void main(String[] args) { //我们每次调用不同的求和方法时需要调用不同的方法名 getsum1(10,20); getsum2(1.0,2.0); //当如果我们业务量很大,但是调用的方法又是同类型的,所实现的功能基本相同时,我们每次都要输入不同的方法名,那么多方法名还要一个一个记住,是不是很麻烦? } //声明一个整数求和的方法,返回值为int类型,两个形式参数a和b public static int getsum1(int a,int b) { return a+b; } //声明一个小数求和的方法,返回值为int类型,两个形式参数a和b static double getsum2(double a,double b) { return a+b; }
所以,为了屏蔽了统一功能的方法由于参数不同所造成的方法名称不同,简化代码提高代码健壮性,就需要方法的重载。
2.什么是方法的重载?
重载方法定义:在同一个类中,某方法允许存在一个以上的同名方法,只要他们的参数列表不同即可。
我们用一个例子就可以搞懂,只需要把上边的代码修改一下
public static void main(String[] args) { getsum(10,20); getsum(1.0,2.0); } //声明一个整数求和的方法,返回值为int类型,两个形式参数a和b public static int getsum(int a,int b) { return a+b; } //声明一个小数求和的方法,返回值为int类型,两个形式参数a和b static double getsum(double a,double b) { return a+b; }
是不是两个方法名是相同的,但传入的值数据类型是不同的?
没错,这就是重载,只要我们传入的实参值要么类型不同,要么个数不同,要么顺序不同,程序会自动找到我们是想要调用那个同名的方法
3.方法重载的原则
两同一不同原则
两同:在同一个类中,方法名相同
一不同:方法的参数列表不同(参数类型、参数个数、参数顺序)。
非常典型的一个例子就是我们的print()方法
public static void main(String[] args) { //可以打印不同数据类型的值 System.out.println("重载"); System.out.println(123); System.out.println(3.2); System.out.println(true); }
注意:
println是可以打印空行的,我们来看源码就非常清晰,直接调用了一个newLine()的方法。
public void println() { newLine(); }
而当我们传入参数时,其实也是调用这个方法,先调用了print()方法输出之后调用换行的方法来实现的
public void println(boolean x) { synchronized (this) { print(x); newLine(); } }
看完print方法是不是更好地理解了为什么要重载? 如果没有重载,那我们每次要打印输出的时候就要写不同的print方法名了,再加上println的方法名,可想而知需要记住很多东西,可是很容易记混和掉头发的哦。
二、方法递归
1.什么是方法的递归
方法的递归简单地说就是方法自己调用自己,其实也类似于一种循环。
举个例子,我们上学时都学过斐波那切数列:
F(0)=0,F(1)=1, 当n>1时,F(n)=F(n-1)+F(n-2)
例如我们求F(5)=F(4)+f(3),而F(4)=F(3)+F(2),F(3)=F(2)+F(1),F(2)=F(1)+F(0)
这样其实F(5)=5F(1)+2F(0)
我们并不好得出一个规律来计算这个数列,所以就需要用到递归来解决这种问题
public static void main(String[] args) { int ret=fn(6); System.out.println(ret); } public static int fn(int n) { //当n==0是,返回值为0 if(n==0) { return 0; }else if(n==1) { //当n==1时返回值为1 return 1; }else { //当n>1时,调用自身fn,将n-1,和n-2这个参数传入到fn()方法中。如果n-2和n-1还是大于1和0,那么就继续调用自身fn(),直到值==0或1,之后依次返回0和1进行运算 return fn(n-1)+fn(n-2); } }
我们在我的电脑里进入每个盘,在进入到每个盘的文件夹,依次往下,这个操作其实就是递归方法。
注意: 在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。不然很容易陷入到死循环导致崩溃。
2.递归有什么用途呢?
知乎大神列举了一些用途个人感觉还是很不错的。当然我们刚开始接触java可能用的并不是很多,随着我们以后的发展,可能会接触到递归算法。
2 树的相关算法 具体使用的例子有,代码的编译(语法树),字典(map)的搜索树实现(各种bst),搜索引擎字符串检索算法(利用trie)。。。
3 图的相关算法 例子,运输规划(最大流),游戏中的怪物ai(A*搜索) 。。。
4 分治法 例子,快速排序,归并排序。。。
5 动态规划(记忆化搜索) 例子太多不举了。。
6 并发算法 利用递归的许多算法都是良好的并发算法
来源:知乎