【详细解释第三部分:方法的使用【java版本详细】】
目录
- 一、方法的定义以及使用
- 二、方法概念及使用
- 1.什么是方法
- 2.方法定义
- 3.方法调用的执行过程
- 4.实参与形参的关系 ==【非常重要】==
- 没有返回值的方法
- 三、方法的重载(**重点**)
- 四、方法签名(没有上一个重要)
- 五、递归
- 递归代码进行分析(图片的方式):
一、方法的定义以及使用
在编程当中,某段功能的代码可能频繁使用,如果在每一个位置都实现一遍,会使:
1.使程序变得繁琐
2.开发效率低下,做了大量的重复性的工作
3.不利于维护,需要改动时,所有用到该段代码的位置都需要进行修改
4.不利于复用
因此在编程过程当中将频繁使用到的代码进行封装,需要的时候只需要进行调用就可以
二、方法概念及使用
1.什么是方法
方法就是一个代码的片段,使用的时候会更加的方便,对于重复的工作只需要调用相关的代码即可已完成所有的工作
2.方法定义
修饰符 | 返回值类型 | 方法名称 |
---|---|---|
public/private… | 八种基本类型+引用类型 | 根据具体情况取名称 |
eg:实现一个函数,检测一个年份是否是闰年
已知:判断闰年有两种方式
整除4 && 不整除100 || 整除400
public class Method{
public static boolean isLeapYear(int year){
if(0==year%4&&0!=year%100) ||0==year%400{
return true;
}else{
return false;
}
}
}
其中将0放在等号的左边,是为了防止比较的过程中少写一个等号而造成代码出错的问题
注意事项:
1.返回值类型:如果有返回值,必须与返回的实体类型一致,如果没有返回值,必须写成void的形式
2.方法名称:采用小驼峰命名
3.在java当中方法必须写在类当中
4.方法不支持嵌套定义
5.java当中没有方法的声明
3.方法调用的执行过程
调用方法—>传递参数—>找到方法地址—>执行被调用的方法体—>被调方法结束返回—>回到主调方法继续往下执行
注意事项:
1.只有在调用方法的时候,方法才会被执行
2.一个方法可以被多次调用
eg:计算1!+2!+3!+4!+5!;
public class TestMethod{
public static void main(String[] args){
int sum = 0;
for(int i = 0; i <=5; i++){
sum = fac(i);
}
System.out.println("sum = " + sum);
}
public static int fac(int n){
int a = 1;
for(int i = n; i>=1; i--){
a = a*i;
}
return a;
}
}
使用方法,避免使用二重循环,让代码更加简单清晰
4.实参与形参的关系 【非常重要】
形参:形参只是在方法当中需要借助的一个变量,用来保存方法在调用时传递过来的值
public static int getSum(int N){
return (1+N)*N/2;
}
getSum(10);
getSum(100);
其中的调用当中的10是实参
形参N用来保存10这个数据
注意:
在java当中,实参的值永远都是拷贝到形参当中,实参和形参本质上是两个个体
eg:代码演示问题说明:
public class TestMethod{
public static void main(String[] args){
int a = 10;
int b = 20;
swap(a,b);
System.out.println("main:a = " + a + "b = "+b);
}
public static void swap(int x,int y){
int tmp = x;
x = y;
y = tmp;
System.out.println("swap:x = "+ x +"y = " +y);
}
}
//运行结果:
swap: x = 20 y = 10
main: a = 10 b = 20
原因解释
实参a和b是main方法中的两个变量,空间是在main栈当中的,而形参x和y是swap方法中的两个变量,空间是在swap运行的栈当中的
只是将实参当中a和b的值拷贝到了一份给了形参x和y
解决方案 传引用类型参数
public class TestMethod{
public static void main(String[] args){
int[] arr = {10,20};
swap(arr);
System.out.println("arr[0] = " +arr[0] +"arr[1] = "+arr[1];
}
public static void swap(int[] arr){
int tmp = arr[0];
arr[0] = arr[1];
arr[1] = tmp;
}
}
此时的运行结果就会发生改变
没有返回值的方法
有的时候是可以没有返回值的,但是必须要将返回值写成void的形式
三、方法的重载(重点)
1.原因:在使用代码期间可能会出现一堆代码的本质操作是一样的,但是需要取不同的名称
eg:在对一个整数进行相加操作时,可能还会出现对浮点数进行相加的操作,或者等等
此时就需要进行重载操作
public class Test{
public static void main(String[] args[]){
add(1,2);
add(1.5,2.5);
add(2.3,4.5,6);
}
public static int add(int a,int b){
return a+b;
}
public static double add(double a,double b,double c){
return a+b+c;
}
public static double add(double a,double b){
return a+b;
}
}
注意:
- 方法重载时:方法名必须相同
- 参数列表必须不同(参数的个数不同,参数的类型不同,类型的次序必须不同)
- 与方法的返回参数是没有关系的
如果仅仅是返回类型不同,是不能够构成重载的
编译器在编译代码时,会对参数类型进行推演,根据推演出来的结果来确定调用哪一个参数
四、方法签名(没有上一个重要)
来由:在一个作用域当中不能够定义一个相同名称的标识符,但是为什么在一个类当中就可以定义方法名相同的方法呢?
根据编译器的变异修改的过程之后方法会有最终的名字:具体:方法全路径名+参数列表+返回值类型,从而构成方法完整的名称
方法签名当中的一些特殊字符
特殊字符 | 数据类型 |
---|---|
V | void |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
[ | 数组(以[开头,配合其他字符表述对应数据类型的数组) |
L | 引用类型,以L开头,以;结尾,中间是引用类型的全类名 |
五、递归
通俗易懂的含义是:遇到问题:将原问题拆分为子问题,且子问题与原问题有相同的解法
用代码进行实例:
eg:求N的阶乘:
public static void main(String[] args){
int n = 5;
int ret = factor(n);
System.out.println("ret ="+ret)
}
public static int factor(int n){
if(n==1){
return 1;
}
return n*factor(n-1);//进行对自身进行调用
}
递归代码进行分析(图片的方式):
其中的红色表示递,蓝色表示归
上述的图片是对递归的一个详细清晰的介绍