代码是直接抄的简书上的,网址在这里.但是我觉得能更加完善一点.
https://www.jianshu.com/p/7ac60e182449
还看了慕课手记的这篇文章
https://www.imooc.com/article/80310
上简书上的代码:
接口代码:
// 状态变化监听
interface StateChangeListener {
// 回调方法
void StateChange(boolean State);
}
开关控件代码:
// 自定义开关--!
class OpenClose {
// 持有一个接口对象
StateChangeListener stateChangeListener;
// 提供注册事件监听的方法
public void setOnChangeListener(StateChangeListener stateChangeListener) {
this.stateChangeListener = stateChangeListener;
//因为是模拟,所以需要在此将控件状态传出
IsClick(true);
}
//是否被点击
public void IsClick(boolean isClick) {
// 通过接口对象传控件状态
stateChangeListener.StateChange(isClick);
}
}
测试代码:
public class CallBackTest {
public static void main(String[] args) {
OpenClose oc = new OpenClose();
oc.setOnChangeListener(new StateChangeListener() {
@Override
public void StateChange(boolean State) {
if (State) {
System.out.println("开");
} else {
System.out.println("关");
}
}
});
}
}
我觉得能真正的走一遍代码就可以理解的比较透彻了.
我们从main中出发
声明一个OpenClose对象
执行oc的函数setOnChangeListener( 这里传入一个StateChangeListener接口的实现类,它实现了接口的StateChange()函数 )
它只是使用了匿名内部类的形式来实现接口的,一般的实现就是下面这种形式
oc.setOnChangeListener(new StateChangeListener());
class StateChangeListener实现类() implements StateChangeListener{
@Override
public void StateChange(boolean State) {
if (State) {
System.out.println("开");
}else {
System.out.println("关");
}
}
}
其实就是传入了一个对象.
但是对于这种setOnChangeListener()方法,我个人有时候就认为跟那种POJO对象的set()方法是一样的,只要带了set的前缀就类似于下面的Java代码,认为就只有一句this.??? = ???.
class Animal{
string name;
void setName(String name){
this.name = name;
}
}
;但是又没有规定带set前缀的方法就只能这样,像回调函数就不同,我在进行this.??? = ???时就还调用???的方法,来执行调用.
我们在看一下上面的代码,为了方便我把代码再次放到下边.
开关控件代码:
// 自定义开关--!
class OpenClose {
// 持有一个接口对象
StateChangeListener stateChangeListener;
// 提供注册事件监听的方法
public void setOnChangeListener(StateChangeListener stateChangeListener) {
this.stateChangeListener = stateChangeListener;
//因为是模拟,所以需要在此将控件状态传出
IsClick(true);
}
//是否被点击
public void IsClick(boolean isClick) {
// 通过接口对象传控件状态
stateChangeListener.StateChange(isClick);
}
}
注意看这个setOnChangeListener(),除了this.??? = ???;还有一个调用方法,别看它是IsClick(),其实就是一种线性的调用.直观的来看就是下面的代码
// 自定义开关--!
class OpenClose {
// 持有一个接口对象
StateChangeListener stateChangeListener;
boolean isCilck = true;
// 提供注册事件监听的方法
public void setOnChangeListener(StateChangeListener stateChangeListener) {
this.stateChangeListener = stateChangeListener;
//因为是模拟,所以需要在此将控件状态传出
stateChangeListener.StateChange(isClick);
}
}
显然,我们又调用了,我们传进来的那个StateChangeListener接口实现类对象的方法StateChange().
那这个StateChange()方法在哪里呢?我再把上面代码拿下来.
测试代码:
public class CallBackTest {
public static void main(String[] args) {
OpenClose oc = new OpenClose();
oc.setOnChangeListener(new StateChangeListener() {
@Override
public void StateChange(boolean State) {
if (State) {
System.out.println("开");
} else {
System.out.println("关");
}
}
});
}
}
我自己画了张图就这样.
不理解上图就看下边
或者你可以这样看!!!!!!!!!!!
测试代码:
public class CallBackTest {
public static void main(String[] args) {
OpenClose oc = new OpenClose();
oc.setOnChangeListener(new StateChangeListener实现类());
}
}
class StateChangeListener实现类() implements StateChangeListener{
@Override
public void StateChange(boolean State) {
if (State) {
System.out.println("开");
}else {
System.out.println("关");
}
}
}
我自己画了张图,就像这样.
从第一种看,程序看起来像从main中到了oc的set,然后又从set到了main的change(),这种一来一回就叫回调.
从第二种看,程序其实就是从main中到了oc的set,然后从set又到了实现类的change(),只是这个实现类是在main中实现的罢了.
总之,别想的太难了,理解理解