方法重载(overload)
- 功能虽然不同,但是“功能相似”的时候,方法重载机制可以让相似的方法就像在用一个方法一样。【Java支持这种机制而有些语言则不支持,例如JavaScript】
- 功能相似的时候,方法名可以相同。
1、什么时候考虑使用方法重载?
- 功能相似的时候,尽可能让方法名相同【但是功能不同/不相似的时候,尽可能让方法名不同】
2、什么条件满足之后构成了方法重载
- 在同一个类当中
- 方法名相同
- 参数列表不同:
1、数量不同:public static void m1(){} 与 public static void m1(int a){}
2、顺序不同:public static void m2(int a,double b){} 与 public static void m2(double a,int b){}
3、类型不同:public static void m3(int x){} 与 public static void m3(double x){}
方法重复,编译错误。
public static void m4(int a,int b){
}
public static void m4(int b,int a){
}
3、方法重载和什么有关系,和什么没有关系
- 方法重载和方法名+参数列表有关系
- 方法重载和返回值类型无关
- 方法重载和修饰符列表无关
方法递归
- 什么是递归?
即:方法自身调用自身。
a(){
a();
}
- 递归是很耗栈内存的,递归算法可以不用的时候尽量别用。
- 以下程序运行的时候发生这样的一个错误【不是异常,是错误error】:
java.lang.StackOverflowError
栈内存溢出错误
错误发生无法晚挽回,只有一个结果。就是JVM停止工作。 - 递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误。
- 递归即使有了结束条件,即便结束条件是正确的,也可能会发生栈内存溢出错误,因为递归太深了。
注意:
- 递归可以不使用尽量别用。
- 但是有些情况下该功能的实现必须依靠递归方式。
例子
递归计算前n个数的和:
public class RecursionTest01{
publci static void main(String[] args){
int n=4;
int reValue=sum(n);
System.out.println(reValue);
}
public static int sum(int n){
if(n==1){
return 1;
}
return n+sum(n-1);
}
}
递归计算n的阶乘:
public class RecursionTest02{
publci static void main(String[] args){
int n=5;
int reValue=method(n);
System.out.println(reValue);
}
public static int method(int n){
if(n==1){
return 1;
}
return n*method(n-1);
}
}