什么是方法?
方法就是一个代码片段,类似于C语言当中的“函数”。
方法就是一个完整的功能,我们只用给这个功能传递相应的参数,然后我们得到相应的结果,至于怎样实现,在使用的时候不关心。
方法的意义
- 是能够模块化的组织代码(当代码规模比较复杂的时候);
- 做到代码被重复使用, 一份代码可以在多个位置使用;
- 让代码更好理解更简单;
- 直接调用现有方法开发, 不必重复造轮子。
方法的使用
方法的定义
// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
列如一个方法检测一个年份是否为闰年
public class Method{
// 方法定义
public static boolean isLeapYear(int year){
if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){
return true;
}else{
return false;
}
}
}
注意事项
- 修饰符:现阶段直接使用public static 固定搭配
- 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成 void
- 方法名字:采用小驼峰命名
- 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
- 方法体:方法内部要执行的语句
- 在java当中,方法必须写在类当中
- 在java当中,方法不能嵌套定义
- 在java当中,没有方法声明一说
方法的调用
调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体--->被调方法结束返回--->回到主调方法继续往下执行
【注意事项】
- 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
- 一个方法可以被多次调用
实参和形参
形参可以简单的理解为方法所需要的数据变量。比如定义了一个Add方法求两个数的和:
public static void main(String ags[]){
int a = 10;
int b = 20;
int ret = Add(a, b);
System.out.println(ret);
}
public static int Add(int x, int y){
return x + y;
}
上述代码当中,main 函数里的 a 和 b 就是实参,而Add方法当中的 x 和 y 就是形参。
在Java语言当中,实参和形参是两个实体,形参的值都是拷贝了实参的值,当方法执行完之后,形参销毁,形参发生改变,也不会同步到实参当中(引用类型除外);
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方法中 的两个变量,x和y的空间在swap方法运行时的栈中,因此:实参a和b 与 形参x和y是两个没有任何关联性的变量, 在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b 产生任何影响。
方法的重载
为什么要重载?
想一想如果此时我们要写一个两个整数相加的Add方法,那要是我想写一个三个整数的相加,还能叫Add吗?两个浮点数相加呢?对于方法的命名是个大问题,并且还要全部记住,太麻烦,所以有了重载。
重载的概念
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。
public class TestMethod {
public static void main(String[] args) {
add(1, 2); // 调用add(int, int)
add(1.5, 2.5); // 调用add(double, double)
add(1.5, 2.5, 3.5); // 调用add(double, double, double)
}
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
public static double add(double x, double y, double z) {
return x + y + z;
}
}
调用的方法会根据不同的参数类型、个数、次序匹配相应的方法。
注意:
- 方法名必须相同
- 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
- 与返回值类型是否相同无关
- 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法
递归
生活中的递归故事
从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是:
"从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是:
"从前有座山,山上有座庙..." "从前有座山……"
上面的两个故事有个共同的特征:自身中又包含了自己,该种思想在数学和编程中非常有用,因为有些时候,我们 遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解 决之后,原问题就迎刃而解了。
递归的概念
一个方法在执行过程中调用自身, 就称为 "递归”。
递归的必要条件: 1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
2. 递归出口
递归可以帮助我们解决问题,但是也存在着一定的弊端,比如使用递归计算斐波那契数列,随着计算的位置增加,会出现大量的重复计算,导致性能下降,所以要灵活运用。