回调函数正确理解

回调过程

简单理解就是,A调用B,然后B在调用A

这里写图片描述

对应模型
这里写图片描述

对应代码

回调接口

package callback;

public interface CallBack {
    void backMethod();
}

调用者

package callback.other;

import callback.CallBack;

public class Caller implements CallBack{  
    private Called called;  

    public Caller(Called called) {  
        this.called = called; 
        //注册回调,让被调用者能够调用调用者的方法
        this.called.addRegister(this);
    }  

    public void request() {  
        System.out.println("这是调用者Caller,开始调用request方法");
        called.specRequest();
    }

    @Override
    public void backMethod() {
        System.out.println("回调方法backMethod,用于调Caller的方法");
        requestSelf();
    }  

    //可以使用调用者的变量,方法等
    public void requestSelf() {
        System.out.println("调用者Caller自身方法requestSelf");
    }
}  

被调用者

package callback.other;

import callback.CallBack;

public class Called {

    CallBack CallBack;

    public void addRegister(CallBack CallBack) {
        this.CallBack = CallBack;
    }

    public void specRequest() {
        System.out.println("这是被调用者Called具体的方法specRequest");
        //开始回调
        CallBack.backMethod();
    }


}

测试类

package callback.other;

public class Test {  
    public static void main(String[] args) { 
        //被调用者
        Called called = new Called();
        //调用者
        Caller caller = new Caller(called);
        //调用者发起请求
        caller.request();  
    }  
}  

测试结果

这是调用者Caller,开始调用request方法
这是被调用者Called具体的方法specRequest
回调方法backMethod,用于调Caller的方法
调用者Caller自身方法requestSelf

达到预期回调效果

回调函数应用JFrame点击事件

内部类方式

这里写图片描述
对应代码

package callback.other;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyJFrame extends JFrame {

    private static final long serialVersionUID = 1L;

    //初始化一个jlable,通过点击事件改变标签显示
    JLabel emptyLable = new JLabel("开始文字");

    public MyJFrame() {
    }

    public void start() {
         //初始化一个jframe
        JFrame frame = new JFrame("测试窗口");

        //初始化一个panel
        JPanel panel = new JPanel();

        //初始化一个容器
        Container container = frame.getContentPane();

        //初始化一个按钮
        JButton button = new JButton("变变"); 
        button.addActionListener(new ConcreteActionListener());

        //设置布局
        container.setLayout(new FlowLayout());

        //把按钮添加到pannel
        panel.add(emptyLable);
        panel.add(button);

        //设置关闭方式
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //把panel添加到容器
        container.add(panel);

        //设置大小
        frame.setSize(600,500);

        //设置位置
        frame.setLocation(100, 100);

        //设置可见性
        frame.setVisible(true);
    }

    //需要回调方法,重新显示内容
    private void display() {
        emptyLable.setText(System.currentTimeMillis()+"");
    }

    public class ConcreteActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            //回调
            display();
        }

    }
}

测试代码

package callback.other;

public class MyFrame {
    public static void main(String[] args) {
        MyJFrame jFrame = new MyJFrame();
        jFrame.start();
    }

}

测试结果

  1. 第一次结果
    这里写图片描述
  2. 点击结果
    这里写图片描述
调用者自身实现回调接口方式

这里写图片描述
目的是为了简化实例化对象,减少对象数据,即省略以下代码
这里写图片描述

对应代码

package callback.other;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyJFrame extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;

    //初始化一个jlable,通过点击事件改变标签显示
    JLabel emptyLable = new JLabel("开始文字");

    public MyJFrame() {
    }

    public void start() {
         //初始化一个jframe
        JFrame frame = new JFrame("测试窗口");

        //初始化一个panel
        JPanel panel = new JPanel();

        //初始化一个容器
        Container container = frame.getContentPane();

        //初始化一个按钮
        JButton button = new JButton("变变"); 
        button.addActionListener(this);

        //设置布局
        container.setLayout(new FlowLayout());

        //把按钮添加到pannel
        panel.add(emptyLable);
        panel.add(button);

        //设置关闭方式
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //把panel添加到容器
        container.add(panel);

        //设置大小
        frame.setSize(600,500);

        //设置位置
        frame.setLocation(100, 100);

        //设置可见性
        frame.setVisible(true);
    }

    //需要回调方法,重新显示内容
    private void display() {
        emptyLable.setText(System.currentTimeMillis()+"");
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //回调
        display();
    }

}

测试类

package callback.other;

public class MyFrame {
    public static void main(String[] args) {
        MyJFrame jFrame = new MyJFrame();
        jFrame.start();
    }

}

测试结果

  1. 第一次结果
    这里写图片描述
  2. 点击结果
    这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值