函数基础
什么是函数?
函数就是定义在类中的具有特定功能的一段独立小程序,并能被多次使用。
函数的格式
-
权限修饰符:指的就是函数的使用范围(内部和外部) 函数类型:指的就是函数类型分类,说的就是函数的具体使用场景和场合
-
函数名:就是程序员给这一段代码自定义的名称(标识符)
-
参数列表:参数列表有若干个 参数类型,参数名… 组成主要用于接收外界传递给函数的一些数据
-
函数体:就是那些具有独立功能的代码块
-
return:仅仅表示结束当前函数,如果有返回值,则函数结束前将返回值返回给调用者
-
返回值:指的就是这一具有独立功能的代码块的计算结果,需要传递给外界 配合return
-
返回值类型:就是返回值的数据类型(可兼容)
如何定义函数
函数就是一个功能,功能就需要两部分:
-
函数运行时有未知参数吗?
-
函数运行完的结果是什么?
定义函数时,时刻把握如下两个明确,基本就可以完成函数的定义: -
明确1:这个功能的结果是什么?其实就是明确返回值类型。
-
明确2:这个功能需要未知内容是什么?其实就是明确参数列表
函数的调用
使用函数名(传入的参数);
函数的分类
1.无参数无返回值的函数
如:权限修饰符 函数类型修饰符 void 函数名() {}
调用时直接函数名();
2.有参数有返回值的函数
如: 权限修饰符 函数类型修饰符 返回类型 函数名(参数类型 形式参数1,参数类型 形式参数2---){}
调用时需要用返回类型接收 返回类型 a =hanshu(实际参数,实际参数---)
3.无参数有返回值的函数
用法和上面类似 权限修饰符 函数类型修饰符 返回类型 函数名(){}
调用时需要用返回类型接收 返回类型 a =hanshu()
4.有参数无返回值的函数
用法和上面类似 权限修饰符 函数类型修饰符 void 函数名(参数类型 形式参数1,参数类型 形式参数2---){}
调用时直接hanshu(实际参数,实际参数----)
例题:猜数字
import java.util.Scanner;
public class Test {
static int sj =(int)(Math.random()*100);
public static void main(String[] args) {
caishu();
}
public static void caishu() {
Scanner sc = new Scanner(System.in);
System.out.print("输入猜的数字:");
int num = sc.nextInt();
if (num<sj){
System.out.print("猜小了,重新猜:");
caishu();
}else if(num>sj){
System.out.print("猜大了,重新猜:");
caishu();
}else{
System.out.print("猜对了");
}
函数的特点
1、定义函数可以将功能代码进行封装
2、便于对该功能进行复用
3、函数只有被调用才会被执行
4、函数的出现提高了代码的复用性
5、对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。
注意:
- 函数中只能调用函数,不可以在函数内部定义函数。
- 定义函数时,函数的结果应该返回给调用者,交由调用者处理。
函数重载
重载的引入
两个数相加,需要一个函数名字getSum,三个数相加需要一个函数名字getSum2,那如果有100个数相加,不是就需要getSum100了?那是不是在调用函数的时候还需要去记住哪个函数名对应多少个参数?这很显然是不可能的了。java为我们提供了重载这个功能,使用重载就可以解决这个问题。
重载的概念
在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可,这时就形成了重载。重载和返回值类型无关。
- 与权限没关系,与返回值类型没关系,与参数名没关系,只有和参数类型的排列组合有关系(注意一下参数类型的向下兼容问题)
- 重载的好处就在于我们可以扩展函数的功能(函数重名,但是参数类型不一样,执行内容也可以不 一样)
函数递归
递归的体现就是函数自身调用函数自身。
一般而言,但凡能够被迭代(循环)解决的问题,递归都可以;递归解决的问题,迭代就不一定了。
递归其实是分治法的一种实现方式(一种实现思路)。
递归就是函数在进栈,进栈的次数多了,势必会占内存,无法避免的
- 在某些问题上,递归所写的代码要比迭代写的代码少
- 在某些问题上,迭代是写不出来的,所以只能用递归
例题:递归实现累加
public class RecursiveAccumulation {
public static void main(String[] args) {
System.out.println(f(100));
}
public static int f(int n) {
if (n == 1) {
return 1;
}
return f(n - 1) + n;
}
}