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可能用的并不是很多,随着我们以后的发展,可能会接触到递归算法。

1 所有的(裸)深度优先搜索算法 具体使用的例子有,几乎所有npc问题,人工智能推导。。。
2 树的相关算法 具体使用的例子有,代码的编译(语法树),字典(map)的搜索树实现(各种bst),搜索引擎字符串检索算法(利用trie)。。。
3 图的相关算法 例子,运输规划(最大流),游戏中的怪物ai(A*搜索) 。。。
4 分治法 例子,快速排序,归并排序。。。
5 动态规划(记忆化搜索) 例子太多不举了。。
6 并发算法 利用递归的许多算法都是良好的并发算法
链接:https://www.zhihu.com/question/28778134/answer/84681099
来源:知乎
posted @ 2018-04-19 18:41  LuckyGJX  阅读(215)  评论(0编辑  收藏  举报