目录
Java函数(方法)
1.函数的概念
2.函数的定义
2.1 定义语法
2.2 定义位置
3.函数的组成
4.函数的调用
函数的参数(形参与实参)
函数返回值与返回值类型
return 关键字
5.总结
6.多级调用
7.递归
无穷递归
递归
循环阶乘
递归阶乘
总结
作业题
面试题
Java函数(方法)
1.函数的概念
概念:实现特定功能的一段代码吗,可反复使用。
2.函数的定义
2.1 定义语法
public static void 函数名称() { // (遵循标识符命名规范)
// 函数主题,功能代码
}
1
2
3
经验:将需要在多个位置重复使用的一组代码,定义在函数内。
2.2 定义位置
函数定义在类的内部,在main函数并列。
3.函数的组成
public static void 函数名(形参) {
// 函数主题,功能代码
}
1
2
3
public:修饰符(后面会介绍)
static:修饰符(后面会介绍)
void:返回值
函数名:遵循标识符命名规范
形参:形式参数
多数情况下,函数与调用者之间需要数据的交互;调用者必须提供必要的数据,才能使函数完成相应的功能。
调用函数时,所传入的数据被称为“参数”。
4.函数的调用
调用语法:
函数名称(实际参数);
1
经验:“实参”等价于“局部变量的赋值”。
函数的参数(形参与实参)
定义语法:
public static void 函数名(形参) {
// 函数主题,功能代码
}
1
2
3
经验:“形参”等价于“局部变量的声明”。
调用语法:
函数名称(实际参数);
1
经验:“实参”等价于“局部变量的赋值”。
单个参数:
多个参数:
经验:根据具体的业务需求,来定义函数的参数。
函数返回值与返回值类型
函数调用时,一些情况下无需返回结果;另一些情况下则必须返回结果。
例如:
存款操作无需返回结果。
取款操作必须返回结果。
定义语法:
public static 返回值类型 函数名称(形式参数) {
// 函数主体
return value; // 返回值
}
1
2
3
4
规定返回值的具体类型(基本、引用、void)
根据需求返回一个结果(值)。
调用语法:
变量 = 函数名称();
1
return 关键字
return的两种方法:
应用在具有返回值类型的函数中:
return value; // 表示结束当前函数,返回值结果,返回到函数调用处。
1
- 应用在没有返回值类型(void)的函数中:
1
return; // 表示结束当前函数,直接返回到函数调用处。
1
5.总结
注意:一个类中可以定义多个函数,函数之间属于并列关系,不可嵌套。
经验:一个函数只做一件事。
好处:
减少代码冗余。
提高复用性。
提高可读性。
提高可维护性。
方便风合作。
6.多级调用
public class TestNestInvoke {
public static void main(String[] args) {
m1();
}
public static void m1() {
System.out.println(“m1() - start”);
m2();
System.out.println(“m1() - end”);
}
public static void m2() {
System.out.println(“m2() - start”);
System.out.println(“m2() - end”);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
运行结果:
m1() - start
m2() - start
m2() - end
m1() - end
1
2
3
4
优先执行函数内部代码,结束后,返回到调用处,继续向下执行。
7.递归
无穷递归
public class TestRecursionInvoke {
public static void main(String[] args) {
m1();
}
public static void m1() {
System.out.println(“m1() - start”);
m1();
System.out.println(“m1() - end”);
}
}
1
2
3
4
5
6
7
8
9
10
运行结果:
m1() - start
m1() - start
m1() - start
m1() - start
m1() - start
…
Exception in thread “main” java.lang.StackOverflowError
1
2
3
4
5
6
7
Exception in thread “main” java.lang.StackOverflowError内存溢出错误
递归
实际开发中,递归可以解决具有特定规律的特定问题。
何时使用递归?
当需要解决的问题可以拆分成若干个小问题,大小问题的解决方法相同。
有固定规律,函数中自己调用自己。
如何正确使用递归?
设置有效的出口条件,避免无穷递归。
循环阶乘
计算阶乘:5 ! = 5 * 4 * 3 * 2 * 1;
public class TestFactorial {
public static void main(String[] args) {
System.out.println(factorial(5));
}
public static int factorial(int n) {
int sum = 1;
for (int i = 2; i <= n; i++) {
sum *= i;
}
return sum;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
依次与每个值相乘即可。
递归阶乘
阶乘的定义:n != n * (n-1) * (n-2) * (n-3) …
public class TestFactorial {
public static void main(String[] args) {
System.out.println(factorial(5));
}
public static int factorial(int n) {
if (n == 1) { // 出口条件 n = 1时,无需计算阶乘们直接返回结果1;
return 1;
}
return n * factorial(n - 1);
}
}
1
2
3
4
5
6
7
8
9
10
11
注意:所有能以递归解决的问题,循环都可以解决。当解决复杂问题时,递归的实现方式更为简单。
总结
函数的概念:
实现特定功能的一段代码,可反复使用。
函数的定义:
public static void 函数名() {函数主体}
函数的组成:
形参列表、实参列表、返回值类型、返回值、函数名、函数主体。
函数的调用:
函数名(实参…);
函数的好处:
减少冗余、提高复用性、可读性、可维护性、方便分工合作。
递归:
将大问题拆分成若干个小问题,大小问题的解决方法相同,有固定规律、函数中自己调用自己。
作业题
计算从1到某个数以内所有奇数的和。
计算从1到某个数以内所有能被3或者17整除的数的和。
计算1到某个数以内能被7或者3整除但不能同时被这两者整除的数的个数。
计算1到某个数以内能被7整除但不是偶数的数的个数。
从键盘输入一个数n,判断是不是一个质数(质数是只能被1和它自身整除的数)。
求2〜某个数之内的素数。【素数 : 只能被1或本身整除的数】
判断某个年份是否是闰年。
A:能被4整除,并且不能被100整除 (2020)
B:或者能被400整除。
已知有一个数列:f(0) = 1,f(1) = 4,f(n+2) = 2 * f(n+1) + f(n),其中n是大于0的整数,求f(n)的值(提示:使用递归)
求2+22+222+2222。
int a=0,sum=0;
for(int n=1;n<=4;n++){
a=(a*10)+2;
sum+=a;
}
System.out.print(“sum=”+sum);
1
2
3
4
5
6
使用递归实现10 的阶乘。
求某个三位数以内的水仙花数:
水仙花数:一个数各个位上的立方之和,等于本身
例如: 153 = 1(3) + 5(3)+3(3) = 1+125+27 = 153
面试题
面试题
方法的传参过程是如何工作的
在调用方法的使用,在方面参数中写入实参,jvm运行时,会把实参赋值给形参。
return关键字的用法有哪些,举例说明
return; //结束方法 ,可以省略
return sum; //返回结果 sum ,结束方法