Java中接口存在的目的

众所周知,Java只有单继承,即一个类只能有一个父类。固然,这种特性避免了像C++中的令人头疼的二义性问题,但是这是有代价的:当我想让类A继承类X的属性和方法时,如果类A已经有了一个父类B,那我只能让类B继承类X,类A才能继承到类X,而如果类B也已经有了一个父类,那么……
上述问题的最终结果就是,为了让类A继承到类X的属性和方法,所有与类A有继承关系的类都会继承类X,这显然不是我们想要的结果。为了处理这种情况,Java提供了接口(interface)。

与Java接口相关的关键字

  1. 定义接口的关键字:interface
  2. 继承接口的关键字:implements
public interface X {
	/***/
}

public class A implements X {
	/***/
}

也许你已经注意到接口用的也是继承。没错,因为接口其实是一种特殊的类,它只能由常量和抽象方法构成。

public interface jiekou {
	public static final i = 0;
	public abstract void play();
//博主用的1.8的jdk发现还可以定义public/default修饰的静态方法,其他版本的没试过,各位可以去尝试一下
//	public static void print() {System.out.println(i);}
}

接口中的常量和抽象方法的关键字是固定的,即常量只能是public static final,方法只能是public abstract,所以省略(或残缺)也是允许的,但不能是其他的,否则会报错。所以接口和抽象类很类似,只不过接口是完全、彻底的抽象,不允许定义任何方法。

继承接口与继承类不同,接口可以继承多个!格式如下:

public interface A{
	public static final int a = 0;
	public abstract void play();
}

public interface B{
	public static final int b = 0;
	public abstract void print();
}

public class test implements A,B/*...*/{
	public abstract void play(){
		System.out.println(a);
	}
	public abstract void print(){
		System.out.println(b);
	}
}

接口可以理解为一种极度抽象的抽象类,所以一个类如果不是抽象类,那么它必须实现所有的抽象方法。

Q:那么接口可以继承其他类吗?
A:是可以的,但是只能继承接口,而且可以继承多个接口,关键字为extends,如下:

public interface A{
	public abstract playA();
}

public interface B{
	public abstract playB();
}

public interface X extends A, B{
	public abstract playX();
}

public class test implements X{
	public abstract playA(){}
	public abstract playB(){}
	public abstract playX(){}
}

以上也可以看出,非抽象类必须实现所有接口的所有的抽象方法。

关于监听的几个概念

监听最主要的一个部分就是接口,看完上面关于接口的内容,我们再来看监听的几个概念。

  1. 事件源对象
  2. 对象的事件监听方法
  3. 事件的处理方法

这部分更多地是抽象概念,虽然不难理解,但用一个例子会更清晰一点:
小明用移动鼠标点击了登录按钮,弹出了一个窗口。

事件源对象

事件源对象,顾名思义,就是事件发生的被动对象。在以上的例子中(按下按钮并弹出窗口),事件源对象应该是登录按钮,而不是小明。因为小明是主动的,登录按钮是被动的。这样定义的原因就是我们监听是为了在接收到信息之后做出反应,前提条件就是被动接受信息,所以事件源对象是某个动作的被做动作的对象,而不是做动作的对象。
在Java中,我们要监听的对象自然就是各种组件。

对象的事件监听方法

我们已经有了事件源对象-按钮,那么如果我们要模拟上述例子,还需要弹出一个窗口,弹出的前提就是登录按钮知道它被按了。怎么让它知道呢?这就需要用到对象的事件监听方法。

JButton button;
/**
 *按钮各项属性的设置
 */
button.addActionListener(ActionListener类对象);

上面的addActionListener方法就是对象的事件监听方法,当然这种方法有很多,这里只举出一个例子。

事件的处理方法

当添加完监听器(ActionListener类之类的对象)后,对按钮的一些操作就可以被监听到,对象和事件的信息会被传递给事件的处理方法。

public class Listener implements ActionListener{
	public void actionPerformed(ActionEvent e) {
		/*实现弹出一个窗口*/
	}
}

public class Test{
	public static void main(String[] args){
		JFrame frame = new JFrame();
		/*frame属性设置*/
		Listener listener = new Listener();
		JButton button;
		/*button属性设置*/
		button.addActionListener(listener);
		frame.add(button);
		frame.setVisible(true);
	}
}

上面的actionPerformed方法就是一个事件的处理方法。当按钮被按下时,按按钮这个事件和按钮对象的信息就会被打包到ActionEvent类对象e内并传递给actionPerformed方法,然后弹出一个窗口(这里就不写了)。