Java中接口存在的目的
众所周知,Java只有单继承,即一个类只能有一个父类。固然,这种特性避免了像C++中的令人头疼的二义性问题,但是这是有代价的:当我想让类A继承类X的属性和方法时,如果类A已经有了一个父类B,那我只能让类B继承类X,类A才能继承到类X,而如果类B也已经有了一个父类,那么……
上述问题的最终结果就是,为了让类A继承到类X的属性和方法,所有与类A有继承关系的类都会继承类X,这显然不是我们想要的结果。为了处理这种情况,Java提供了接口(interface)。
与Java接口相关的关键字
- 定义接口的关键字:interface
- 继承接口的关键字: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(){}
}
以上也可以看出,非抽象类必须实现所有接口的所有的抽象方法。
关于监听的几个概念
监听最主要的一个部分就是接口,看完上面关于接口的内容,我们再来看监听的几个概念。
- 事件源对象
- 对象的事件监听方法
- 事件的处理方法
这部分更多地是抽象概念,虽然不难理解,但用一个例子会更清晰一点:
小明用移动鼠标点击了登录按钮,弹出了一个窗口。
事件源对象
事件源对象,顾名思义,就是事件发生的被动对象。在以上的例子中(按下按钮并弹出窗口),事件源对象应该是登录按钮,而不是小明。因为小明是主动的,登录按钮是被动的。这样定义的原因就是我们监听是为了在接收到信息之后做出反应,前提条件就是被动接受信息,所以事件源对象是某个动作的被做动作的对象,而不是做动作的对象。
在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方法,然后弹出一个窗口(这里就不写了)。