一、方法概念及使用
1.1 什么是方法
大家都应该都或多或少的接触过C语言,在C语言中要实现两数相加,我们可以写一个Add函数,在Java中,我们可以把这个函数理解为方法,调用函数就是调用方法。以下是方法存在的意义:
1. 是能够模块化的组织代码(当代码规模比较复杂的时候)。
2. 做到代码被重复使用, 一份代码可以在多个位置使用。
3. 让代码更好理解更简单
4. 直接调用现有方法开发, 不必重复造轮子
1.2 方法的定义
1. // 方法定义 2. 修饰符 返回值类型 方法名称([参数类型 形参 ...]){ 3. 方法体代码; 4. [return 返回值]; 5. }
咱们来一个例子体验一下:
实现一个两个整数相加的方法:
1. public class Method{ 2. // 方法的定义 3. public static int add(int x, int y) { 4. return x + y; 5. } 6. }
注意:1. 修饰符:现阶段直接使用public static 固定搭配
2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成 void
3. 方法名字:采用小驼峰命名
4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
5. 方法体:方法内部要执行的语句
6. 在java当中,方法必须写在类当中
7. 在java当中,方法不能嵌套定义
8. 在java当中,没有方法声明一说
1.3 方法调用的执行过程
调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体--->被调方法结束返回--->回到主调方法继续往下执行
大家可这样理解:Java是面向对象编程,不必像C语言一样关注底层。调用方法过程,可想象办事情:首先,找到受理机构,找到其中处理的部门,递交材料,该部门会进行审批什么的,不用你关心,然后告知你成功不成功,然后按照事实在做行动。
注意:定义方法的时候, 不会执行方法的代码。
只有调用的时候才会执行。
一个方法可以被多次调用。
实例: 计算两个整数相加
1. public class Method { 2. public static void main(String[] args) { 3. int a = 10; 4. int b = 20; 5. System.out.println("第一次调用方法之前"); 6. int ret = add(a, b); 7. System.out.println("第一次调用方法之后"); 8. System.out.println("ret = " + ret); 9. System.out.println("第二次调用方法之前"); 10. ret = add(30, 50); 11. System.out.println("第二次调用方法之后"); 12. System.out.println("ret = " + ret); 13. } 14. public static int add(int x, int y) { 15. System.out.println("调用方法中 x = " + x + " y = " + y); 16. return x + y; 17. } 18. } 19. // 执行结果 20. 一次调用方法之前 21. 调用方法中 x = 10 y = 20 22. 第一次调用方法之后 23. ret = 30 24. 第二次调用方法之前 25. 调用方法中 x = 30 y = 50 26. 第二次调用方法之后 27. ret = 80
1.4 形参与实参的关系
在我们C语言过程中我们明白:形参是实参的一份临时拷贝,那么,这个结论在Java中是否适用呢?咱们使用一个例子来探究一下:
题目:交换两个整型变量
1. public class TestMethod { 2. public static void main(String[] args) { 3. int a = 10; 4. int b = 20; 5. swap(a, b); 6. System.out.println("main: a = " + a + " b = " + b); 7. } 8. public static void swap(int x, int y) { 9. int tmp = x; 10. x = y; 11. y = tmp; 12. System.out.println("swap: x = " + x + " y = " + y); 13. } 14. } 15. // 运行结果 16. swap: x = 20 y = 10 17. main: a = 10 b = 20
通过结论我们可以得出,同样适用,即形参是实参的一份临时拷贝。在C语言学习中,我们可以通过指针来完成,但是我们明白Java中没有指针,那么,我们该如何使用方法来完成这个代码呢?答案是:数组。代码如下:
1. public class TestMethod { 2. public static void main(String[] args) { 3. int[] arr = {10, 20}; 4. swap(arr); 5. System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]); 6. } 7. public static void swap(int[] arr) { 8. int tmp = arr[0]; 9. arr[0] = arr[1]; 10. arr[1] = tmp; 11. } 12. } 13. // 运行结果 14. arr[0] = 20 arr[1] = 10
二、方法重载
在我们学习C语言完成转移表(计算器)时,我们要写出不同名字的函数,叫人叫苦不迭,那么在Java中我们还要在经历一遍这样的痛苦吗?答案是:不需要。因为Java有一个功能叫方法重载。
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。请各位看如下代码:
1. public class TestMethod { 2. public static void main(String[] args) { 3. add(1, 2); // 调用add(int, int) 4. add(1.5, 2.5); // 调用add(double, double) 5. add(1.5, 2.5, 3.5); // 调用add(double, double, double) 6. } 7. public static int add(int x, int y) { 8. return x + y; 9. } 10. public static double add(double x, double y) { 11. return x + y; 12. } 13. public static double add(double x, double y, double z) { 14. return x + y + z; 15. } 16. }
在使用方法重载时注意以下几点:
1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关
4.两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
5.编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法
重载可这样理解:重名这件事在生活中很常见,比如:这有个张三,那有个张三,那么折磨确定你叫的就是你想叫的呢?很简单,加上特征,比如:性别(类型),如果性别一样可以说其它的 ,如:学习好的,长得高的什么的。特征要不一样,不然不仅你无法区分,编译器也无法区分。
三、递归
想必大家对于递归都不陌生,那递归不就是:“我”调“我自己”,即一个方法在执行过程中调用自身, 就称为 "递归"。
对于递归,大家应该能想起一个耳熟能详的故事,如下:从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是: "从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是: "从前有座山,山上有座庙..." "从前有座山……"(此段只是为了活跃气氛)
想到这,是不是对于递归有了些许认识了呢?递归很简单,即:我调我自己。也可以理解为套娃。
咱们来几道例题吧:
1.按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
1. public static void print(int num) { 2. if (num > 9) { 3. print(num / 10); 4. } 5. System.out.println(num % 10); 6. }
2.写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回 1+7+2+9,它的和是19
1. public static int sum(int num) { 2. if (num < 10) { 3. return num; 4. } 5. return num % 10 + sum(num / 10); 6. }
3.求斐波那契数列的第 N 项
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
1. public static int fib(int n) { 2. if (n == 1 || n == 2) { 3. return 1; 4. } 5. return fib(n - 1) + fib(n - 2); 6. }
今天的学习到今天就结束了,如有问题可私信,也可在评论区交流。
完!