浅谈Java中的接口回调

接口

        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),按钮就会反过来调用接口的方法。接口的方法已经由当前按钮所在的类(第一种情况)或者一个匿名内部类(第二种情况)实现了。

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

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值