接口
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);
}
@Override
public 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的匿名内部类
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
mJTextField.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 stub
mCountryA = countryA;
}
public void getMessage(String str) {// 得到消息,A要攻打B
System.out.println(str);
mCountryA.Attack(CountryB.this);// A攻打B
}
@Override
public void traitor(String traitor) {// 接口回调
// TODO Auto-generated method stub
System.out.println(traitor);
}
}
package com.java.simpleCallbackTest;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CountryA a = new CountryA();
CountryB b = new CountryB(a);// A去攻打B
b.getMessage("B:A要来攻打我们了");
}
}
程序运行结果如下:
一个简单的接口回调就实现了,以此类推,当外部事件点击按钮时,触发了点击事件(就像A攻打B),按钮就会反过来调用接口的方法。接口的方法已经由当前按钮所在的类(第一种情况)或者一个匿名内部类(第二种情况)实现了。
这是小弟我第一次写博客,希望大家多多指教,共同进步!