递归:方法定义中调用方法本身的现象
递归的分类分为2种:
- 直接递归称为方法自身调用自己
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则就会发生栈内存溢出
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出
- 构造方法禁止递归
递归的使用前提:
当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归
只有方法没有new对象,只有栈内存,没有堆内存
浅谈栈内存溢出--
递归一定要有条件限定,保证递归能够停止下来,否则就会发生栈内存溢出
错误代码内存溢出:
package com.baidu;
public class diGui01 {
public static void main(String[] args) {
a();
}
private static void a(){
/*
递归一定要有条件限定,保证递归能够停止下来,否则就会发生栈内存溢出
*/
System.out.println("a方法被执行了!");
a();
}
}
栈内存中运行的都是方法,程序执行的方法main方法压栈执行,main方法里面调用的是a方法,一旦a方法被调用,
a方法就压栈进入栈内存并且执行,a方法里面又会调用a方法,a方法又会压栈进入并执行,最后a方法太多了,就会
超出栈内存的范围,导致栈内存溢出的错误
注意:
当一个方法调用其他方法的时候,被调用的方法没有执行完毕,当前方法会一直等待调用的方法执行完毕才会继续执行
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出
错误代码内存溢出(我的电脑i到11408就挂了):
package com.baidu;
public class diGui01 {
public static void main(String[] args) {
//a();
b(1);
}
private static void a(){
/*
递归一定要有条件限定,保证递归能够停止下来,否则就会发生栈内存溢出
*/
System.out.println("a方法被执行了!");
a();
}
private static void b(int i){
System.out.println(i);
if (i == 20000){
return;
}
b(++i);
}
}
构造方法禁止递归
现在编译器都很智能的,直接编译报错
编译报错的原因:构造方法是创建对象的时候使用的,一直递归会导致内存中有无数多个对象,直接编译报错
=======华丽的分割线======
醒来的时候,希望自己不负大好时光,To know the unknown