Java-方法的详解( 看完之后,我不允许还有人不懂!)

一、什么是方法

方法和C语言的函数的功能是一样的,但在具体使用上,还是有区别的,区别在定义里面说。
对于方法,在我的脑海中我想象出了生活中的情景去理解它,我将方法比作了思路去进行了理解。:
在我高中时期,当我们学生在做完一套题时,学生有不会的题,就去问自己班的老师去,其中有一道题,老师被问了好多遍,老师就想这个题这么多学生问,可能还有的同学不会i,没有来问,我就去课上讲一下这道题的思路,让不懂的同学都听一下,此时老师把这道题的思路公布出来,讲给所有的同学听,这样就少讲了好多遍,不用单个单个的再给学生重复讲了,提高了效率。
在编程的世界中,也有这样的事情发生,如果有一段代码需要被频繁的使用,那么就把这一段代码写成一个方法,这个方法就是我上面说的老师讲的这道题的思路,思路就是一个方法,一个可以解决一个问题的方法,在需要这一段代码时,只需要调用这个方法就可以,不用再重复编写代码。
对于方法的理解,同志们应该多做一些练习,才能更深刻的理解,方法被创造出来的意义。

二、方法定义

方法是由哪几部分组成的呢?就像一道题的思路,思路由开头,中间和结尾组成。
方法由修饰符+返回值类型+方法名称+参数类型+方法体代码+return 返回值组成,如果返回值类型是void,就不需要return 返回值。

定义方法时,有以下注意事项:
1:对于返回值类型,如果方法不需要返回一个值,返回值类型就是void,void表示的是无类型,中间的字母o,可以理解为空的意思,空就代表没有。具体一点可以理解为:返回值类型就是数据类型,可以向内存申请空间,如果方法不需要返回一个值,我为什么还要申请空间呢?直接给void,很合理,如果方法要返回一个值,就给定合适的数据类型用来接收就可以。我个人理解的这里方法返回的值和给定的数据类型和C语言中的地址和指针类型的变量是相似的,在C语言里面,我是这样理解地址和指针类型的变量的,地址我想象成了一个魂,孤魂野鬼的魂,它必须要找到一个躯壳,来存放自己的魂,躯壳要和自己的魂相对应,如果是一个人类的魂,要找到人类的躯壳,如果是狗狗的魂,要找到狗狗的躯壳里面,所以地址要存放到指针类型的,变量里面时,要找对数据类型,如果是整型的地址,要放到整型的指针变量里面,如果是浮点型的地址,要放到浮点型的变量里面,所以方法返回的值,应该方法应该使用合适的数据类型的变量接收。
2: 方法的名字要使用小驼峰命名:例如isPrime,第二个单词的首字母要大写,大驼峰的意思是,每一个单词的首字母大写,例如:TestDemo
3: 如果参数列表中没有参数,就什么都不写,如果有参数,参数与参数之间使用逗号隔开。
4: 方法必须写在类当中,写在类外面会出错,这里将类比作教室,方法比作学生,如果学生在上课期间跑出教室,那学生就犯错了。
5: 方法不能嵌套定义,意思是不能在一个方法里面,定义一个新的方法,如果要定义一个方法,必须要在方法外定义,方法与方法之间是平等的,将方法比作学生,学生不可能生出学生,这是没有逻辑的。

三、方法调用

方法调用就是去使用方法,如何去使用方法呢?,方法名代表方法,就像我们的名字就可以代表我们个人,写下方法名再将需要传给方法的值,传给方法,等待编译到这行代码时,就会使用这个方法,调用这个方法。
传给方法的值是方法的实参,用来接收传进来的值的是形参,在这里可以将方法比喻成一个加工厂,原材料就是实参,要将原材料送进厂子里去,就要需要地方来存放这些原材料,这个地方就是形参,最后加工厂加工出的产品可以交出来,也可以不交出来,不交出来,就无法使用这个产品,只有交出来,才能使用。

对实参和形参的认识:
对于基本类型来说:
形参只是实参的一份临时拷贝,对形参的修改不能改变实参的值。
实参和形参保存在内存空间的位置不一样。
我将实参和形参这两者的关系,想象成了我生活中的一个情景,我将实参比作在高中时期,一个原装的卷子,这个卷子是老师手写的,要去复印好多份,此时形参是复印出的卷子,如果此时有一个学生将复印的卷子给扔掉了,那么那张手写的卷子会不会受到影响,答案是不会的。
对于引用类型: 学到数组再讲!

四、方法重载

1、什么是方法重载?

方法重载的意思是方法名同时被多个方法所使用,也就是一个人的名字被很多人使用,世界上不可能只有一个人叫马云。

2、为什么会出现方法重载?

这里可以想象一个公厕可以由很多人使用,如果一个公测只能由一个人使用,那得需要建多少公厕,又费时间又费金钱。
在我们编写代码时,是一个道理,为了提高我们的效率,会定义很多方法,如果一个方法对应一个方法名,那需要记很多方法名,这很费劲,所以就规定一个方法名可以由很多方法共用。

3、被称为方法重载的必要条件是什么?

  1. 方法名必须相同
  2. 这里可以想象世界上不可能有两个一摸一样的人,即使他们的名字相同,但总会有差异,就像马云和小马云,虽然他们的名字一样,但是他们的身高,智力等等,这些一样吗?肯定是不一样的,对于方法的参数列表也是一样的,方法的参数列表必须不相同,参数列表不相同包括为:参数个数不同+参数次序不同+参数的类型不同,只要有一个不同,就是参数列表不同,也就是马云和小马云他俩身高不一样,这一点就说明了,他俩是不相同的,即使名字是相同的。
  3. 与返回值的类型是否相同无关
    一二点是成为方法重载必须遵循的条件,缺一不可,就像是方法重载是一个学习好的人,你要成为学习好的人,你必须各科成绩都好,才会成为学习好的人,只要有一科不好,就不是学习好的人,你必须满足前面两点,才会称为方法重载,第三点就像是高中的体育课,这门的成绩不会决定你是学习好的学生还是学习不好的学生,即使只有返回值的类型不同,参数列表都相同,仍然不能称为重载。

4、编译器是如何识别出相同名字的方法的呢?

成功在编译器上编写了两个名字相同的方法,编译器是如何识别出这两个不一样的方法的呢?是使用方法签名,进行标识出不同的方法来的。
方法签名是由:方法全路径名+参数列表+返回值类型,这三者构成。

五、递归

1、什么叫递归?

一个方法在执行过程中,或者说在完成任务的时候,调用自己的过程,叫做递归。
对于递归这个过程,我想象出了一个生活中的例子:
我正在家中写作业,然后妈妈叫我去买一瓶酱油,在去的路上,我在路下玩了一会,玩完之后,我去买酱油,买到之后回家,再继续写完作业。
写作业->买酱油->玩,这一个过程叫做递,
玩完->买完酱油->写完作业,这一个过程叫做归。
两个过程合并到一起,叫做递归。

在这里插入图片描述

2、为什么要使用递归?

对于为什么使用递归,我又想到了生活中的例子:
就比方说吃一大碗米饭,不可能一口吃完,那就要分好几口才能吃完,直到吃完为止。
递归就是这样的一个过程,一个解决问题的一个过程,吃一碗米饭,可以理解为一个问题,要解决的问题,原问题太复杂,不能一下子解出来,那就把这个原问题拆分,拆成一个与原问题相似,但规模较小的问题,如果还不好解开,就一直拆,直到能够很容易解开为止。

3、递归作为一个过程,什么时候停止?

递归,顾名思义它是一个过程,递出去之后,它要归。
就像你写作业时,妈妈让你买酱油,你在买酱油的路上,玩了一会,玩到天黑了,就该停止了,不能在去干别的了,你就要去买酱油,买完酱油就该回家写作业了。
这个条件就是:天黑,到天黑之后,就要往回走了,不能在往外边走了。

4、详细理解递归这个过程:

在这里插入图片描述

5、使用递归的练习题

1、求n的阶乘

现在的问题是:使用方法求n的阶乘,一下子不好求,进行拆分,就像吃米饭一样,可以先求出n-1的阶乘,再乘以 n,再拆,求n-2的阶乘,再乘以n-1,最后拆成只剩下求1的阶乘,就可以完成这个任务了。

	public static void main(String[] args) {
        System.out.println("请输入:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int ret = 0;
        ret = jieCheng(n);
        System.out.println(ret);
    }

    public static int jieCheng(int n) {
        if(n == 1) {
            return n;
        } else {
            jieCheng(n - 1);
            return n * jieCheng(n - 1);
        }
    }

2、从左到右打印一个数的每一位

现在的问题是:打印每一位,使用方法去解决这个问题,但一下子解不出来,把问题拆分,拆成先不用打印最后一位,打印前面的,再拆,直到拆到打印一位,这个问题可以轻松完成,再继续完成后面的任务。

	public static void main(String[] args) {
        System.out.println("请输入:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        print(n);
    }

    public static void print(int n) {
        if(n < 9) {
            System.out.print(n + " ");
        } else {
            print(n / 10);
            System.out.print(n % 10 + " ");
        }
    }

3、求1-n之和

	public static void main(String[] args) {
        System.out.println("请输入:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int ret = 0;
        ret = sum(n);
        System.out.println(ret);
    }

    public static int sum(int n) {
        if(n == 1) {
            return n;
        } else {
            sum(n - 1);
            return n + sum(n - 1);
        }
    }

4、逆置数组中的元素

	public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        int left = 0;
        int right = arr.length - 1;
        rew(arr,left,right);
        System.out.println(Arrays.toString(arr));
    }

    public static void rew(int[] arr,int left,int right) {
        if(left >= right) {
            ;
        } else {
            rew(arr,left+1,right-1);
            int tmp = 0;
            tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
        }
    }

5、分别打印一个数的二进制位的奇数位和偶数位

	public static void main(String[] args) {
        System.out.println("请输入:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = 1;
        System.out.println("奇数位是:");
        odd(n,k);
        System.out.println();
        System.out.println("偶数位是:");
        even(n,k);
    }

    public static void odd(int n,int k) {
        if(k == 32 && k % 2 == 1) {
            System.out.print((n&1)+" ");
        } else if(k < 32){
            odd(n >>> 1,k+1) ;
            if(k % 2 == 1) {
                System.out.print((n & 1) + " ");
            }
        }
    }

    public static void even(int n,int k) {
        if(k == 32 && k % 2 == 0) {
            System.out.print((n & 1) + " ");
        } else if(k < 32){
            even(n >>> 1,k+1) ;
            if(k % 2 == 0) {
                System.out.print((n & 1) + " ");
            }
        }
    }
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值