能用循环尽量不用递归
递归 :方法定义中调用方法本身的现象。
方法的嵌套使用,不是递归:Math.max(Math.max(a,b),c);
这才是递归: public void show(){
show();
}
注意事项:递归一定要有出口,否则就是死递归
递归的次数不能太多,否则就内存溢出
构造方法不能递归使用
递归解决问题的思想:(找到出口和找到规律)
分解法和合并法
递归实现:做递归要写一个方法;出口条件;规律
兔子问题(斐波那契数列)
A:数组实现
B:变量的变化实现
C:递归实现
回调
模块间调用
(1)同步调用:同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等待b()方法执行完毕,a()方法继续往下走。这种调用方式适用于方法b()执行时间不长的情况,因为b()方法执行时间一长或者直接阻塞的话,a()方法的余下代码是无法执行下去的,这样会造成整个流程的阻塞
(2)异步调用:异步调用是为了解决同步调用可能出现阻塞,导致整个流程卡住而产生的一种调用方式。类A的方法方法a()通过新起线程的方式调用类B的方法b(),代码接着直接往下执行,这样无论方法b()执行时间多久,都不会阻塞住方法a()的执行。但是这种方式,由于方法a()不等待方法b()的执行完成,在方法a()需要方法b()执行结果的情况下(视具体业务而定,有些业务比如启异步线程发个微信通知、刷新一个缓存这种就没必要),必须通过一定的方式对方法b()的执行结果进行监听。在Java中,可以使用Future+Callable的方式做到这一点
(3)回调:是一种双向的调用方式
类A的a()方法调用类B的b()方法
类B的b()方法执行完毕主动调用类A的callback()方法
例子
1.回调接口:public interface Callback { public void tellAnswer(int answer); }
2.定义一个老师对象,实现Callback接口:
1 | public class Teacher implements Callback { |
3.定义一个学生接口,学生当然是解决问题,但是接收一个Callback参数,这样学生就知道解决完毕问题向谁报告
1 | public interface Student { |
4.定义一个学生的实现类
1 | public class Ricky implements Student { |
demo:
1 | public class CallbackTest { |
回调的核心就是回调方将本身即this传递给调用方