兔C残篇:java方法的使用,以及如何掌握递归。

1.什么是方法

说到 java 中的方法,我们学习过程中,或者是工作中,我们用java进行编码程序时,都离不开方法的调用。比如我们需要创建对象帮我们做什么事,而帮我们做事的对象一定有做这件事的自己的独有方法。生活中也离不开方法,我们都有自己擅长的方法,比如你用什么方法学习,我用什么方法学习,他会用什么方法学习。那说到方法,java中的方法到底是什么?

写一句代码来体现一下:

System.out.println("我是一个方法");

//其实我们经常接触到的sout语句也是一个方法!!

sout 方法讲解:

你不信啊?我们姑且不论他是不是方法,你真正的知道这句语句的含义么?这个语句是在说 调用 System系统类的 out对象的println() 方法。以至于更深的理解,我这里不进行讲解,为什么?

我告诉你为什么:

学习要讲究方法,我在过去的学习中,一直处于一种背离两岸的状态。什么是背离两岸,我所谓的背离两岸就是,我付出的时间和收获不成正比,总有一种自己还没有开窍的感觉。为什么?其实学习是要讲究方法的。

例如把学习划分为阶段:获取,理解,拓展。

获取的时候,要压缩信息,什么叫压缩信息,就是速度要快,精度要准确的方式去获取信息。不要大量吸收。

理解:把快速获取到的有效知识进行理解。

拓展:在理解到一定程度的水平之后, 我们进行拓展。就好像现在,你已经知道了sout语句的含义,但是不知道我说的是否准确,是否精准,或者是我说的是我的理解,但是不是官方的语言表达方式,这时候你可以通过你理解到的信息,进行拓展。授人以鱼不如授人以渔,我没有敷衍,如果你拥有和我相同的问题,你会明白我讲的话有多少益处。听我的,自己去拓展吧,自己要养成习惯,但是切记,获取的口诀,不要陷入获取到的知识中,记住获取的口诀,告诉自己获取的意义所在,不要因为一味获取,忽略掉理解的感受。

2.方法的组成
//这里我们先写出一个方法
public void tcDemo(){
     
}

看到上面的代码我们在来说方法的组成

public //权限修饰符,决定此方法的被调用的权限,就比如你声明的是私有的权限,那此时的私有方法,你看看有哪里可以调用

void //方法的返回值,我们知道前几篇的兔C博文中,我们有聊到过java的数据类型。八大数据类型在方法中同样适用,  void 仅仅是代表一个空返回值的方法,如果你声明方法时,声明了返回值类型,那么你在方法中,需要加入return 来将 方法中的值进行返回。当然return还有另一个意义,就是结束方法
     
tcDemo //这是我自己定义的方法名,当然你自己创建的方法,名称由有你自己来决定,当时起名时我们要遵循命名的规范,也就是小驼峰命名规则
     
( );   //( ) 我这里写的是一个标准的普通方法,如果你想让方法帮你做事情,也就是让方法体里的逻辑代码帮你做"事情",你需要把材料交给他,也就是 给方法定义形参。java 是值传递的,比如 我们想让tcDemo这个方法,帮助我们做加法运算,我们除了在方法体中写好逻辑代码,还需要把值进行传递,所以括号中我们就需要定义好两个参数,用于让方法可以接收外面传递进方法中。

{
     //括号中写逻辑代码。值传递进来的时候,方法就可以通过此逻辑代码,帮助我们做事情了
}
3.方法的重载

什么是方法的重载,我告诉你!

//你以为我放个代码块是要写代码么?
//嘤嘤嘤,我就不写,我用大白话就能让你不会在忘。

首先我们需要先知道方法重载的概念:方法名相同(参数列表不同)

你在记住这句概念的时候,加上这个括号去记,你就能体会到什么是参数列表不同了。

我们直观一点理解,我们可以这么理解,方法的重载,就是同一个方法,发出的不同技能。我们都知道使用方法的时候需要传递参数,那我们传递的参数类型变了,比如之前是两个int,现在是两个double,那我们需要不需要重新写一个方法?需要么?还是一样的逻辑,你重新写一个方法,换两个参数,你自己觉得有必要么。

恰好我们的java也提供了方法的重载机制,什么意思,不理解没关系,我告诉你直观点,你自己去掺杂理论知识去体会,Ctrl +c +v 一个方法,把参数列表里值的类型改一下。别的不动,你看看重载不。

直观吧,哈哈哈。

但是啊!

我以前在学的时候经常记不住概念,方法名相同,参数列表不同,这个能记住,那返回值类型呢?这个记不住。

确实对于我们新手来说理论知识太生涩了,那怎么办?

我告诉你,你把参数的类型改了,返回类型你改不改?之前是两个int,现在是两个double。

你以为完事了?不…这不是答案。

我只是让你去自己动手尝试,我问你,如果你的返回值类型是对象呢?

思考1分钟。

思考2分钟。

思考3分钟。

答案是:与返回值无关! 噔噔蹬蹬。

4.方法重载的规则
  • 方法名称必须相同
  • 参数列表不同(个数不同,类型不同,参数排列顺序不同等)
  • 方法的返回类型可以相同也可以不同
  • 仅仅返回类型不同不足以成为方法的重载

实现理论:

方法名称相同时,编译器会根据调用方法的个数,参数类型等去逐一进行匹配,以选择对应的方法,如果匹配失败,编译器会报错。

5.命令行传递参数

现在我们懂得了java方法的基本使用,我们知道了方法的使用,方法的定义,还有方法的组成部分,然后还知道用return来结束一个方法,还知道它的使用规则,那就是重载。知道了这么多,那你知不知道主函数也是个方法,你当然知道了对吧。

那你知不知道主函数也可以传参,这里我跟大家聊一下命令行传参,对喽,也就是用命令行的形式,在程序运行时,给主函数传递参数。

//我们先定义一个类,类里只定义一个主函数
public class testTc {
    public static void main(String[] args) {

        for (int i = 0; i < args.length; i++) {
            System.out.println("当前循环到的主函数数组中的值为:"+args[i]);
        }
    }   
}

//这里直接利用IDEA 打开当前类的 磁盘中所在位置
在这里插入图片描述

//然后进入到文件的磁盘位置之后,我们在地址位置栏中,写cmd回车,来打开命令行,在dos命令行中输入命令

javac 类名.java 进行编译

但是会提示我们一个编码错误:编码GBK的不可映射字符,出现这个错误的原因是因为我们在保存写好的java文件的时候,没有进行设置,按照UTF-8的编码格式,进行文件的保存。

解决办法:

  1. 去设置一下文件的保存编码格式,这样以后在进行使用的时候就不用敲命令解决了。

  2. 命令解决,输入命令: javac -encoding UTF-8 类名.java

这样就编译通过了

在这里插入图片描述

我自己都不知道没有 java文件没有设置成 默认的 UTF-8 格式保存。。

如果你也不知道你自己的,你就先用 javac 类名.java 去试。如果出现问题的话,在按照上面我告诉你的方案去解决。

这些前手准备我们都完成了,然后我们下面给主函数就行传参,和执行主函数中的逻辑编码。

然后我们通过java命令来运行编译后的class文件

在这里插入图片描述

但是编译依然会出现错误。

因为我们的文件是放在包下的,我们需要退到src目录下

在这里插入图片描述

这样就执行起来了

执行起来之后,我们在写一次执行的命令,但是这次不止写执行的命令,还要在命令后面,为其传递执行时,需要的参数值

如图:

在这里插入图片描述

即图片中的效果,这样我们就通过命令给主函数传递了参数,也让主函数中的代码逻辑执行起来了。

6.命令普及

//用于生成 class 文件的命令

javac 类名.java  
     //用于编译java文件,编译通过后,生成 类名.class文件,也就是计算机能够读懂的文件。

//用于执行生成class文件的命令

java 类名
     //需要注意的是:如果执行的目标文件,有包层级,需要退到src下,然后敲命令的时候,要先写类文件的包层级路径

//用于生成 java文档的命令

javadoc -encoding UTF-8 -charset utf-8 类名.java
7.可变项参数

在java中,我们使用方法,为其传递参数,帮我们执行对应的代码逻辑,但是在定义方法的时候,我们不知道有多少个参数需要传递,但是我们知道传递的参数类型为什么,那我们可以定义可变项参数。

比如我们用int类型举例,定义一个int类型的可变项参数

public void tcTest(int... number){
     
}

//下面放上一个在编译器中的代码抒写图

在这里插入图片描述

8.递归讲解
8.1递归的概念

我们都知道,当我们调用方法的时候,需要创建对象,或者是简单的代码demo里,直接调用当前类中的方法。那递归是什么怎么回事呢,就是用一个方法调用的还是这个方法。自己调用自己就是递归的概念。但这只是递归的一个简单意义的基本认识。

没错你现在只是有了对递归的认知。

利用递归可以用简单的程序来解决一些复杂的问题,它能通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来解决,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

8.2递归的组成

递归的结构包括两个部分:

递归头:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归过程中要有一个边界,递归到一定的边界时,不能再发生递归的事件,否则会造成栈的溢出。

递归体:什么时候需要调用自身方法。也就是当什么时候产生了递归的事件,然后递归的操作,调用了自身,产生了递归的事件,也就产生了递归体。

8.3递归的示例

下面我们利用递归,实现一个阶乘的小算法。

package com.DemoTest.demo03;

public class testRecursion {
    public static void main(String[] args) {
        System.out.println(recursion(5));
    }

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

//我们看到在这个示例中,其实就发生了递归的动作,我们在recursion的方法中又调用了一下 recursion的方法。

我们来说明一下这段代码

我们在类中,声明了两个方法,一个用于程序作为入口的主函数,一个是自己定义的方法。

主函数中我们写了一个输出语句,输出语句中,调用了自己定义的方法,并且为其传递了一个整数,最后让他输出出运算之后的值。

recursion方法:

这里只是写了个阶乘的小逻辑,先写的一个if判断是因为如果传递进来的值为1,那就直接返回一个1,因为1的阶乘还是1。然后else中进行递归,return 传递进来的参数 乘以 recursion 方法的参数(为什么是 n -1)。

(n - 1) 就是阶乘过程中传递进来的数,例如传递进来的是5。那5的阶乘就是 5 * 4 * 3 * 2 * 1 以此下推,进行的乘阶计算

最后就形成了闭环,在执行主函数时,传递参数,然后执行完成后,在控制台我们就可以得到传递进来数,阶乘之后的结果值了。

8.4递归的原理剖析

在阶乘过程中,我们知道了发生了递归的动作。主函数调用方法,然后方法中,再次调用方法,整个过程的组成也很清晰。

首先我们需要清晰 边界条件,也就是递归当中,需要设置一个边界,如果没有边界,程序会无下限的进行执行,那么会造成栈的溢出。此处的边界可以理解成 上述的 -1,当5进行递归,计算阶乘结果是,每次的动作会-1,直到计算值*1的时候就走到了一个边界。

除了边界条件,还有另外两个条件,也就是前阶段,还有返回阶段。

前阶段是指,参数进入方法进行阶乘的动作,产生的下一个递归动作。也就是边界条件内的具体实现动作。

然后是返回阶段,返回阶段会将递归过程中,每个方法的计算结果逐一进行返回。

如果理解的不够直观,我们画一个方法图

在这里插入图片描述

8.5 java栈的简单认识

说完了递归的事,我们记着往下聊栈的事,这里谈及栈的一个简单认识。

JVM调用方法的时候,会将方法压倒栈中,如果还有新的方法调用动作产生,那新的方法会继续压到栈中,那么上一次被调用的方法,在栈中的位置,就是处于新方法的栈的位置的下方。

当递归调用方法的时候,无限的方法进入到栈中,那么栈也会出现溢出的情况。

所也就有了递归的弱点。

8.6递归的弱点

所以我们知道了递归的弱点,知道它如果无下线的递归下去,即便设置边界条件,不会让其溢出,但是如果传递的参数不是5,是1000,那么其背后调用的方法,将会产生多少的递归动作呢,所以我们就该知道,不要轻易用到递归,即便用到递归,也要清楚,递归的概念。然后在解决一些复杂的逻辑上我们可以使用,但是不要过度使用,为什么?因为我们已经清楚了递归的相关知识了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兔C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值