💜写在前边💜
前言
咱们在C语言里肯定都学过函数吧,相信大家对函数的理解已经很深刻了,因为函数在C里用的会很多,特别是做项目的时候,会分模块来写,Java里同样为大家提供了“函数”,只不过叫法不一样,Java里叫【方法】,接下来请往下看
【☕Java】C语言里叫【函数】,Java里叫【方法】
💜写在前边💜
🌟方法的基本用法
🌙什么是方法(method)
🌙方法定义语法
🌙方法调用的执行过程
🌙实参和形参的关系(敲重点)
🌙无返回值的方法
🌟方法的重载
🌙重载要解决的问题·
🌙使用重载
🌙重载的规则
🌟方法递归
🌙递归的概念
🌙递归执行过程分析
🌙递归练习
🌙递归总结
🌟方法的基本用法
🌙什么是方法(method)
方法就是一个代码片段. 类似于 C 语言中的 “函数”.
方法存在的意义:
1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
2. 做到代码被重复使用, 一份代码可以在多个位置使用.
3. 让代码更好理解更简单.
4. 直接调用现有方法开发, 不必重复造轮子.
🌙方法定义语法
注意事项
1. public 和 static 两个关键字在此处具有特定含义, 暂时不讨论, 后面会详细介绍.
2. 方法定义时, 参数可以没有. 每个参数要指定类型
3. 方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void(类似C语言)
4. 方法定义时的参数称为 “形参”, 方法调用时的参数称为 “实参”.
5. 方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可.
6. Java 中 没有 “函数声明” 这样的概念(个人觉得是很爽的,在C里边经常被函数声明的问题恶心到).
🌙方法调用的执行过程
基本规则
定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
当方法被调用的时候, 会将实参赋值给形参.
参数传递完毕后, 就会执行到方法体代码.
当方法执行完毕之后(遇到 return 语句), 就执行完毕, 回到方法调用位置继续往下执行.
一个方法可以被多次调用.
使用方法, 避免使用二重循环, 让代码更简单清晰
🌙实参和形参的关系(敲重点)
🌙无返回值的方法
方法的返回值是可选的. 有些时候可以没有的.
🌟方法的重载
有些时候我们需要用一个函数同时兼容多种参数的情况, 我们就可以使用到方法重载.
🌙重载要解决的问题·
🌙使用重载
方法的名字都叫 add. 但是有的 add 是计算 int 相加, 有的是 double 相加; 有的计算两个数字相加, 有的是计算三个数字相加.
同一个方法名字, 提供不同版本的实现, 称为 方法重载
🌙重载的规则
针对同一个类或者继承关系:
方法名相同
方法的参数不同(参数个数或者参数类型)
方法的返回值类型不影响重载.
当两个方法的名字相同, 参数也相同,
但是返回值不同的时候, 不构成重载.
🌟方法递归
若一个对象部分的包含自己或用它自己给自己定义,那么我们说这个对象是递归的;若一个过程直接或间接的调用自己,那么这个过程是递归的。递归的思想是把问题分解为规模更小具有与原问题相同解法的子问题,因此可以让我们思考的方式更加简单,程序也更加简练。不过就递归函数而言递归增加了压栈开销,因此【空间复杂度比较高】。
🌙递归的概念
递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.
递归条件:
(1)减小问题规模,并使子问题与原问题有相同解法。
(2)设置出口,如果没有出口那么程序会一直递归下去。
例如, 我们求 N!
起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!
🌙递归执行过程分析
递归的程序的执行过程不太容易理解, 要想理解清楚递归, 必须先理解清楚 “方法的执行过程”, 尤其是 “方法执行结束之后, 回到调用位置继续往下执行”.
执行过程图解
🌙递归练习
代码示例4 (敲重点!!敲重点!!敲重点!!)
求斐波那契数列的第n项【斐波那契数列是一组第一位和第二位为1,从第三位开始,后一位是前两位和的一组递增数列,像这样的:0、1、1、2、3、5、8、13、21、34、55…】
🌙递归总结
递归是一种重要的编程解决问题的方式.
有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.
有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效.