1 函数的定义
- 函数存在的意义
函数主要解决的是那些重复的且具有独立功能的代码段,将这些具有独立功能的代码可以进行再次封装,封装出来的东西就成为是函数。这样做有很明显的优势,降低了代码冗余复用,降低了主函数的代码量,将主函数进行适当的拆分,以便内存优化就是将代码模块化。
- 函数格式
函数格式:
访问权限 函数类型 返回值类型 函数名(参数列表){
函数体
return 返回值;
}
- 访问权限:指的就是函数的使用范围(内部和外部) public protected 默认不写private
- 函数类型:指的就是函数类型分类,说的就是函数的具体使用场景和场合 static 静态函数 默认不写 成员函数 abstract 抽象函数 native 本地函数 synchronized 同步函数
- 函数名:就是程序员给这一段代码自定义的名称(标识符)
- 参数列表:参数列表有若干个 参数类型,参数名... 组成 主要用于接收外界传递给函数的一些数据
- 函数体:就是那些具有独立功能的代码块
- return:仅仅表示结束当前函数,如果有返回值,则函数结束前将返回值返回给调用者
- 返回值:指的就是这一具有独立功能的代码块的计算结果,需要传递给外界 配合return
- 返回值类型:就是返回值的数据类型(可兼容)
2 函数的分类
有返回值有参数,有返回值无参数,无返回值有参数,无返回值无参数。
注意 有返回值的函数,参与运算、输出、赋值 无返回值的函数,仅仅调用
3 函数传参
- 实际参数-实参
就是在调用函数的时候,给函数传递的数据(常量,变量)叫做实参
- 形式参数-形参
就是定义函数的时候,参数列表当中的数据,叫做形参
实参是将什么东西传递给了形参?
常量在常量池中的地址 对象在堆内存中的地址
局部变量 但凡是在函数中创建的变量 称之为是局部变量 局部变量的作用域仅仅在当前的函数当中 形式参数一定是局部变量
4 函数栈
函数的运行是基于栈内存的
那么,栈是什么呢?
栈是一个先进后出的一个容器结构,子弹按顺序123456进栈,按顺序出栈654321
可以将每一个函数理解为是子弹(函数帧/栈帧),位于栈顶的函数帧优先运行的主函数绝对是第一个进栈的
return结束当前函数 -> 当前函数弹栈
5 函数的重载
函数的重载指的就是同一个类中出现的同名函数,与权限没关系,与返回值类型没关系,与参数名没关系
只有和参数类型的排列组合有关系(注意一下参数类型的向下兼容问题)
重载的好处就在于我们可以扩展函数的功能(函数重名,但是参数类型不一样,执行内容也可以不一样)
寻找适当函数的流程
- 看是否有确切的参数定义 int+int 查看是否有(int,int)
- 看是否有可兼容的参数定义 int+int 查看是否有(double,double)
- 如果可兼容的参数定义有多个int+int,(double,int)或(int,double) 此时报错 引用不明确
6 函数的递归调用
递归的体现就是函数自身调用函数自身,递归其实是分治法的一种实现方式(一种实现思路)
- 递归主要解决什么问题呢?
一般而言,但凡能够被迭代(循环)解决的问题,递归都可以;递归解决的问题,迭代就不一定了。递归就是函数在进栈,进栈的次数多了,势必会占内存,无法避免的。在某些问题上,递归所写的代码要比迭代写的代码少
在某些问题上,迭代是写不出来的,所以只能用递归。
- 分治法与递归
分治法是一种算法思想,分治法主要解决的问题是将大问题,进行拆分,拆分成若干个小的问题进行求解,最终将每个小问题的解进行合并。其实,分治法就是一种暴力**法(穷举),也是一种搜索最优答案的算法
递归:先递,后归 前进段 指的就是讲问题从大化小。结束段:问题无法再继续化小,则处理当前的问题。返回段:将小问题处理完毕之后,向上返回(有些问题是不需要返回的)
7 常用函数
Math类
String类
String不是基本数据类型而是一个类,既然是类那么肯定有其相关的函数
注意:对字符串的修改永远都不是对其自身进行的修改,字符串本身是不可变的,对字符串的修改往往都是新建个字符串将修改后内容赋值并返回新的字符串。