全面分析Java方法的使用与递归

目录
  • java中方法的使用
    • 什么是方法
    • 方法的定义与使用
    • 方法如何进行调用及其方法调用过程
    • 方法的形参和实参
    • 方法重载
    • 方法签名
  • 递归

java中方法的使用

什么是方法

举一个日常生活中的例子,比如我们在学校班长都会发送消息,比如它想让班级里的每一个人到某某教学楼某某班级进行开会,他就会给每个人发信息,同学今天我们有重要会议要进行开班会请你到某某教学楼某某班级来,如果班长要给每一个人发送信息,一个班里有很多人这样班长发信息就会很累,换个思路,班长要群发消息这样是不就会很省心。这也就是与java中的方法类似,我们定义一个方法实现你需要的功能,在你想要调用并且实现这个功能你就可以任意调用。

在编程中如果重复实现某个功能就会

1.使程序变得繁琐

2.开发效率低下,做了大量重复性的工作

3. 不利于维护,需要改动时,所有用到该段代码的位置都需要修改

4. 不利于复用。

方法的意义:

1. 是能够模块化的组织代码(当代码规模比较复杂的时候).

2. 做到代码被重复使用, 一份代码可以在多个位置使用.

3. 让代码更好理解更简单.

4. 直接调用现有方法开发, 不必重复造轮子

方法的定义与使用

定义规范:

修饰符 返回值类型 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}

我们举一个例子:判断是否是闰年:

    public static boolean isLeapYear(int year) {
        if(year%4==0&&year%100!=0||year%400==0) {
            return true;
        }
        return false;
    }

实现两个数的加法:

    public static int add(int x, int y) {
    //实现两个数的加法
        return x + y;
    }

这样的方法就可以在你需要这个功能的时候进行调用,不需要你在写一遍,减少了代码的冗余。

一些关于方法的注意事项:

1. 修饰符:现阶段直接使用public static 固定搭配

2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void

3. 方法名字:采用小驼峰命名

4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开

5. 方法体:方法内部要执行的语句

6. 在java当中,方法必须写在类当中

7. 在java当中,方法不能嵌套定义

8. 在java当中,没有方法声明一说

方法如何进行调用及其方法调用过程

举一个例子:还是上面那个例子判断闰年?

 public static boolean isLeapYear(int year) {
        if(year%4==0&&year%100!=0||year%400==0) {
            return true;
        }
        return false;
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("请您输入year判断是否是闰年?:>");
        int year =scan.nextInt();
        if(isLeapYear(year)) {
            //是闰年
            System.out.print(year+"是闰年");
        } else {
            System.out.print(year+"不是闰年");
        }
 }

我们来剖析一下这段代码:

首先我们需要定义一个年份:

调用方法:

我们可以总结一下方法的调用过程大致是:

调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体--->被调方法结束返回--->回到主调方法继续往下执行

注意事项:

只有定义完方法之后才可以调用方法。并且只有调用方法时,方法才会执行。

我们定义的方法可以多次重复调用。完成我们想要完成的需求。

举个实例:计算1!+2!+3!+4!+5!;

这个代码虽然简单但是可以证明我们把一个功能都实现成一个方法,这样我们调用起来,代码逻辑就很清晰,所以建议我们实现一个功能的时候都要把它封装成一个方法。

方法的形参和实参

Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。形参的名字可以随意取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值。

例如:实现一个方法交换两个整型变量

传值调用:

根据上面的答案,并不是我们想要的结果那是为什么呢?

我们来剖析一下:

有的人还会说那我把形参写成 a和b他会交换a和b的值么?

答案并不会,形参的名字可以任意取与名字无关,如果写成a和b那只能说明原来的两人和你形参这两个人是重名的,并不会本质的改变。

那我们究竟怎么才能改变两个数的值呢?

这就与c语言类似,在c语言中是传两个数的地址而在java中传的是引用,引用存储的是这两个变量在内存的地址,通过地址就可以改变。

由于java语言中没有所谓的取地址,在Java中有引用类型,引用类型所引用的变量就是存储在内存当中的地址。通过地址就可以实质的改变某个值。

在java中引用类型有许多比如,类,对象,数组,字符串等等。

我们接下来利用数组进行交换两个数的值。

public static void Swap(int[] array) {
        int tmp = array[0];
        array[0] = array[1];
        array[1] = tmp;
    }
public static void main(String[] args) {
        int[] array =new int[]{10,20};
        Swap(array);
        System.out.println(Arrays.toString(array));
}

为啥两个值交换呢?因为数组是引用类型,引用变量(这里是array)存放的是数组中的元素在内存中的地址,通过地址就可以真正的改变这两个值。

方法重载

百度百科:方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数或参数的顺序不同的方法。 Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同。调用方法时通过传递给它们的不同个数和类型的参数,以及传入参数的顺序来决定具体使用哪个方法。

看上面复杂的概念一时可能看不懂不如我来举一个例子吧。

好比如我们要实现数的加法,要同时实现两个整形的加法,两个浮点数的加法,三个整形数的加法

我们没学过方法重载可能会这么写。

  public static int addTwoInt(int a,int b) {
        return a+b;
    }
    public static int addThirdInt(int a,int b,int c) {
        return a+b+c;
    }
    public static double addTwoDouble(double a,double b) {
        return a+b;
    }
    public static void main(String[] args) {
        int a =10;
        int b =20;
        int c =20;
        double d =3.14;
        double e =9.89;
        System.out.println(addTwoInt(a, b));
        System.out.println(addThirdInt(a, b, c));
        System.out.println(addTwoDouble(d, e));

    }

对于学过方法重载的同学看见这个代码真想。。。。。

这样的代码是不是看着很繁琐,每一次实现一个加法就要起一个名。上面的代码需要提供许多不同的方法名,而取名字本来就是让人头疼的事情

那我们接下来使用方法重载又有多大的变化呢?

我们都使用相同的名字在idea不会报错,原因是在java语言中支持方法的重载。

所以,在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了

根据这三个代码我们就可以总结出方法重载的规则了

第一:方法名相同;

第二:返回值不做要求;

第三:方法名的参数列表不同(包括参数的返回类型,形参的顺序,形参的个数);

方法签名

既然有方法重载,那java是内部是怎么支持重载的呢?那就要说一说方法签名了。

方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

我们通过找到生成代码的.class文件 然后右键打开powershell

输入一个 javap -v +文件名

回车之后就可以看到java代码的汇编代码,根据汇编代码就可以看到方法的签名。

我们既然定义了相同名字的方法,那编译器是怎么识别我们要调用哪个方法呢?没错这就是方法签名起了作用,每定义一个方法在编译完生成class文件,就会生成一个方法签名,编译器就是根据每个方法的签名不同而识别的,比如你要计算两个double类型的和,那他就会直接找DD的这个签名而不会匹配到其他的签名。

递归

递归定义是数理逻辑和计算机科学用到的一种定义方式,使用被定义对象的自身来为其下定义(简单说就是自我复制的定义)。递归定义(recursive definition)亦称归纳定义,一种实质定义,指用递归的方法给一个概念下的定义

通俗的讲,当我们遇到一个问题,这个问题具有每一步的解法都是相同的,我们就可以将这个大问题分解成多个子问题,最终这个问题就会被解决;

实现递归有两个必要条件:

第一:子问题必须要与原问题的解决方法是相同的。

第二:必须要有判断条件防止递归深度太深导致栈溢出。

我们来举一个经典递归例子:求N的阶乘

我们可以思考一下根据上图的推理第一:他符合原问题的解法与子问题的解法是一致的,有符合判断条件(判断条件就是如果n==1的时候1!=1).这就是递归 从5!被分解成5*4!,4*3!.......

这样的问题就迎刃而解了。

public static int factor(int n) {
        if(n==1) {
            return 1;
        }
        return n* factor(n-1);
    }
    public static void main(String[] args) {
        System.out.println(factor(5));
    }

递归小练习

按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)。

这个题我们怎么思考呢?

首先要得到一个数字的每一位肯定是除10 和模10循环知道数字为0

那我们可以将1234这样来分解;

    public static void printEveryNum(int num) {
        if(num<=9) {
            System.out.print(num+" ");
            return;
        }
        printEveryNum(num/10);
        System.out.print(num%10+" ");
    }
    public static void main(String[] args) {
        int num =1234;
        printEveryNum(num);
    }

递归求 1 + 2 + 3 + ... + 10  递归实现1一直加到10的和

    public static int sum(int num) {
        if(num==0) {
            return 0;
        }
        return num+sum(num-1);
    }
    public static void main(String[] args) {
        int a =10;
        System.out.println(sum(100));
    }

到此这篇关于全面分析Java方法的使用与递归的文章就介绍到这了,更多相关Java方法与递归内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java程序中方法的用法重载和递归

    目录 前言 一.方法的基本用法 1.什么是方法 2.方法的基本定义 3.方法调用的执行过程 4.方法中的实参和形参 二.方法的重载 1.重载的概念 2.例题分析 三.方法的递归 1.递归定义 2.例题分析 3.递归应用场景 总结 前言 "方法"又被称为"函数",其他的编程语言也有这个概念,重要性不言而喻,在这个文章,将介绍如何定义和使用方法. 一.方法的基本用法 1.什么是方法 在Java中,方法定义在类中,它和类的成员属性(数据成员)一起构建一个完整的类.构成方法

  • Java用递归方法解决汉诺塔问题详解

    目录 前言 一.问题描述 二.问题分析 三.解决方案 四.示例 前言 博主之前有写过关于递归问题的思维模式: 递归的思路 下面将用这种思维模式来求解经典汉诺塔问题. 一.问题描述 汉诺塔(又称河内塔)问题是源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上. 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 问应该如何操作? 玩法如下: 1.有三

  • Java实现简单的递归操作方法实例

    前言 在数据结构算法设计中,或者一个方法的具体实现的时候,有一种方法叫做"递归",这种方法在思想上并不是特别难,但是实现起来还是有一些需要注意的.虽然对于很多递归算法都可以由相应的循环迭代来代替,但是对于一些比较抽象复杂的算法不用递归很难理解与实现. 递归分为直接递归和间接递归,就简单分享一下两个小的直接递归. 对于递归的概念,其实你可以简单的理解为自己定义自己,记得小时候看过一部电视剧<狼毒花>,里面主角叫做"常发",但是个文盲,老师问他叫什么,他说&

  • Java 方法递归的思路详解

    目录 前言 一.什么是方法递归 二.什么场景下能用递归 三.如何写出递归代码-重点 总结 前言 今天给老铁们回顾一下递归的思路以及方法,也是给自己的一个归纳总结. 一.什么是方法递归 所谓的方法递归,就是在一个方法(函数)执行的内部,自己调用了自己的过程,称之为 “递归” . 递归分为两个子过程: 递过程:函数不断地调用自身,直到走到函数的终止条件,第一阶段结束. 归过程:函数不断地返回的过程. 例如, 我们求 N! 起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束

  • Java中方法的使用、重载与递归的详细介绍

    目录 一.方法的基本使用 1.什么是方法 2.方法基本语法 二.方法的重载 1.重载的作用 2.重载的使用规则 三.方法的递归 1.递归的概念 2.递归执行过程分析 3.递归练习 1.按顺序打印一个数字的每一位 2.递归求 1 + 2 + 3 + ... + 10 3.返回组成它的数字之和 4.求斐波那契数列的第 N 项 一.方法的基本使用 1.什么是方法 方法是一个代码片段,类似于C语言中的函数 2.方法基本语法 基本语法 // 方法定义 public static 方法返回值 方法名称(参数

  • Java中的递归方法示例介绍

    目录 递归 递归的注意事项: 案例一 递归求阶乘 不使用递归实现阶乘 使用递归实现阶乘 澳大利亚不死神兔(斐波那契数列) 使用数组实现 使用递归实现 总结 递归 方法定义本身调用方法本身的现象叫做递归 在这之前我们学的东西:例如StringBuffer.append().append().append()这个不叫递归.这个叫方法的连续调用Math.max(Math.max(a,b),c)也不是递归,那这些是什么呢?这些是方法的调用. 那什么是递归呢? 举例: 从前有座山,山里有座庙,庙里有个老和

  • java如何用递归方法求阶乘

    java 用递归方法求阶乘 一个正整数的阶乘,是所有不大于该数的正整数的积,并且0的阶乘为1,n的阶乘写作n!,由1808年基斯顿·卡曼(Christian Kramp,1760-1826)引进这个表示法. java代码: //用递归方法求阶乘 public class Factorial{ public static void main(String[] args){ int N = 5; for(int n = 0; n <= N; n++){ int fact = factorial(n)

  • Java递归方法实现山脉绘制

    本文实例为大家分享了Java递归方法实现山脉绘制的具体代码,供大家参考,具体内容如下 一.山脉绘制的思路 给定两个点A(x1,y1),B(x2,y2),递归不断取中点,同时给定一个范围[-range,range]和一个比率rate.每次取中点后,这个中点的纵坐标的值加上这个范围内的随机值,同时通过range=range*rate来缩小这个变化的范围,最后,通过相邻的点连线,绘制成一个山脉的形状. 二.整段代码如下 package com.yf1031; import java.awt.FlowL

  • 全面分析Java方法的使用与递归

    目录 java中方法的使用 什么是方法 方法的定义与使用 方法如何进行调用及其方法调用过程 方法的形参和实参 方法重载 方法签名 递归 java中方法的使用 什么是方法 举一个日常生活中的例子,比如我们在学校班长都会发送消息,比如它想让班级里的每一个人到某某教学楼某某班级进行开会,他就会给每个人发信息,同学今天我们有重要会议要进行开班会请你到某某教学楼某某班级来,如果班长要给每一个人发送信息,一个班里有很多人这样班长发信息就会很累,换个思路,班长要群发消息这样是不就会很省心.这也就是与java中

  • Java方法递归调用实例解析

    这篇文章主要介绍了Java方法递归调用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 /* 关于方法的递归调用 1.什么是递归? -方法自身调用自身 a(){ a(){ } } 2.递归是很耗费栈内存的,递归算法可以不用的时候尽量不用 3.一下程序运行的时候发生了这样一个错误[不是异常,是错误Error]: java.lang.StackOverflowErroe 栈内存溢出错误. 错误放生无法挽回,只有一个结果,就是JVM停止工作 4

  • Java方法的可变参数类型实例分析

    Java方法中的可变参数类型是一个非常重要的概念,有着非常广泛的应用.本文就以实例形式对此加以分析.具体如下: 一般来说,许多Java初学者在看到下面的这段代码的时候,都会问一个问题:dealArray方法里那三个小点点是什么啊? public class TestVarArgus { public static void dealArray(int... intArray){ } public static void main(String args[]){ } } 这就是本文所要讨论的问题:

  • java方法重写实例分析

    本文实例讲述了java方法重写,分享给大家供大家参考.具体分析如下: 一.方法的重写概述: 1.在子类中可以根据需要对从基类中继承来的方法进行重写. 2.重写的方法和被重写的方法必须具有相同方法名称.参数列表和返回类型. 3.重写方法不能使用比被重写的方法更严格的访问权限. 二.程序代码如下: class Person{ private int age; private String name; public void setAge(int age){ this.age = age; } pub

  • 教你用MAT工具分析Java堆内存泄漏问题的解决方法

    一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclipse使用,另一种是独立版,可以直接解压使用. 我把独立版MAT安装包放到了网盘上,方便直接下载 链接: https://pan.baidu.com/s/1DVHlHuSfi_4TVl2ei5YuLA 提取码: 42qt 独立版解压后,其内部文件是这样的-- 这里有一个MemoryAnalyzer.in

  • java方法及this关键字原理分析详解

    目录 步骤1 .给顾客增加一个吃饭的方法 步骤 2 . 没有加static的属性和方法,一定需要先new对象 步骤 3 . 用new出来的对象去执行eat方法 步骤 4 . 怎么理解c.eat() 步骤 5 . 消息接受器 步骤 6 . 如果有两个顾客? 步骤 7 . 答案 步骤 8 .其实有个this 步骤 9 . 在eat方法里面直接使用this 步骤 10 . 构造方法 步骤 11 . 总结:this的意义是什么? 步骤 12 . 道理我都懂,那static又是什么? 步骤 13 . 本节

  • java新人基础入门之递归调用

    一.递归概念 递归本质:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调: 用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过: 程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合. 二.递归的三个条件: 边界条件 递归前进段 递归返回段 当

  • 分析Java设计模式之组合模式

    目录 一.概述 二. 模式定义 三. 模式结构 四. 模式实现 五. 模式优缺点 5.1.优点 5.2.缺点 六. 模式适用场景 七. 模式总结 一.概述 我们对于这个图片肯定会非常熟悉,这两幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构.在数据结构中我们了解到可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作.我们可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象.但是由于容器对象

  • 简单了解Java方法的定义和使用实现

    目录 什么是方法? 方法的定义 2021.6.2 方法的重载(重要笔试可能遇到) 命令行传参 2021.6.3可变参数(也叫不定项参数) 递归(重要,不推荐使用) 2021.6.5什么是数组 数组声明创建 2021.6.6 内存分析(重要) Java内存分析 2021.6.7数组的使用 二维数组 2021.6.8 Arrays类 2021.6.9稀疏数组(复习) 总结 什么是方法? System.out.println(),那么它是什么呢?系统类里的,对象out,输出方法println Java

随机推荐