浅谈Java中的接口回调

来源:互联网 发布:彩票软件易语言源码 编辑:程序博客网 时间:2024/05/16 01:55

接口

        Interface,我们都不陌生,这里就不在赘述接口的定义以及接口的实现了。  很多人刚接触到接口时,教科书无非就是灌输接口就是对类的扩展,使一个类可以实现"多重继承"(因为一个类只能有一个父类)。但是接口的作用远远不止于此,在这里笔者要介绍接口的一种重要的功能。就是——接口回调。
      
        有过swing开发经验的朋友都知道,在为一个组件添加监听时常用的办法有两种。
先来看第一种:
package com.java.myTest;import java.awt.GridLayout;import java.awt.LayoutManager;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextField;public class MyJFrame extends JFrame implements ActionListener {//此处实现ActionListener接口 private JButton mJButton;private JTextField mJTextField;public MyJFrame() {mJButton = new JButton();mJButton.setText("点击");mJButton.addActionListener(this);//  button增加监听 this.add(mJButton);mJTextField = new JTextField();mJTextField.setText("这是一个JTextField的初始文字");mJTextField.setHorizontalAlignment(JTextField.CENTER);this.add(mJTextField);}@Overridepublic void actionPerformed(ActionEvent e) {//点击触发事件,实现回调 <span style=" font-size: 18px;"><strong>  </strong></span>mJTextField.setText("这是JButton点击后的文字");}public static void main(String[] args) {MyJFrame myJFrame = new MyJFrame();myJFrame.setBounds(0, 0, 200, 200);myJFrame.setVisible(true);myJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);myJFrame.setLayout(new GridLayout(2, 1));}}
接下来看第二种:
package com.java.myTest;import java.awt.GridLayout;import java.awt.LayoutManager;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextField;public class MyJFrame extends JFrame {private JButton mJButton;private JTextField mJTextField;public MyJFrame() {mJButton = new JButton();mJButton.setText("点击");mJButton.addActionListener(new ActionListener() {//button增加监听,这里实现ActionListener的匿名内部类@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubmJTextField.setText("这是JButton点击后的文字");}});this.add(mJButton);mJTextField = new JTextField();mJTextField.setText("这是一个JTextField的初始文字");mJTextField.setHorizontalAlignment(JTextField.CENTER);this.add(mJTextField);}public static void main(String[] args) {MyJFrame myJFrame = new MyJFrame();myJFrame.setBounds(0, 0, 200, 200);myJFrame.setVisible(true);myJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);myJFrame.setLayout(new GridLayout(2, 1));}}
实现的效果如下:

按钮点击前:




按钮点击后:



             这是一个很简单的java Swing编程,实现了JButton的点击事件触发的JTextField的文本变化。相信对于绝大多数java初学者都可以实现。但是这里却隐藏着一个很重要的知识点,就是java的接口回调。看,其实java的接口回调技术其实离我们实际开发并不“遥远”,那这种回调技术在java内部是怎样实现的呢,让我们一起来了解一下。

       接口回调就是A调用B的方法,B反过来调用A的方法。让我们设想这样一个场景,A国要去攻打B国(即是A调用B的方法),但是B说如果A你攻打我,你的国家空虚,我就会调用埋伏在A国家的内奸(B反过来调用A的方法),从里面瓦解A国家

package com.java.simpleCallbackTest;public class CountryA {public CountryA() {// TODO Auto-generated constructor stub}/** *  * @param t *            实际上传入的是B的对象 *            ,因为B实现了Traitor接口,所以B也是Traitor。就像继承,狗继承自哺乳动物,所以狗也就是哺乳动物 */public void Attack(Traitor t) {t.traitor("潜伏在A国的B国特工:A国空虚,我们不用潜伏了,我们占领A吧!!!");}public interface Traitor {// 定义一个接口public void traitor(String traitor);}}

package com.java.simpleCallbackTest;import com.java.simpleCallbackTest.CountryA.Traitor;public class CountryB implements Traitor {// 实现了Traitor接口,相当于在A国放下了特工内奸private CountryA mCountryA;public CountryB(CountryA countryA) {// TODO Auto-generated constructor stubmCountryA = countryA;}public void getMessage(String str) {// 得到消息,A要攻打BSystem.out.println(str);mCountryA.Attack(CountryB.this);// A攻打B}@Overridepublic void traitor(String traitor) {// 接口回调// TODO Auto-generated method stubSystem.out.println(traitor);}}

package com.java.simpleCallbackTest;public class Main {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubCountryA a = new CountryA();CountryB b = new CountryB(a);// A去攻打Bb.getMessage("B:A要来攻打我们了");}}


程序运行结果如下:


     一个简单的接口回调就实现了,以此类推,当外部事件点击按钮时,触发了点击事件(就像A攻打B),按钮就会反过来调用接口的方法。接口的方法已经由当前按钮所在的类(第一种情况)或者一个匿名内部类(第二种情况)实现了。

    这是小弟我第一次写博客,希望大家多多指教,共同进步!



1 0