目录
一、接口
①接口声明
定义接口包含声明和接口体,使用关键字interface来定义一个接口。格式如下:
interface 接口名字 {
...
}
②接口体
接口体中包含常量的声明(没有变量)和抽象方法两部分。接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量的访问权限一定都是public,而且是static常量(允许省略public、final和static修饰符),所有的抽象方法的访问权限一定是public(允许省略public abstract修饰符),例如
interface Printable{
public static final int MAX=100; //等价写法:int MAX=100;
public abstract void add(); //等价写法:void add();
public abstract float sum(float x,float y);
}
二、实现接口
①类实现接口
一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口。如果实现多个接口,用逗号隔开接口名,例如A类实现Printable 和Addable接口:
class A implements Printable,Addable
②重写接口中的方法
如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。
注意:由于接口中的方法一定是 public abstract 方法,所以类在重写接口方法时不仅要去掉 abstract 修饰符、给出方法体,而且方法的访问权限一定要明显地用 public 来修饰(否则就降低了访问权限,这是不允许的)。实现接口的非抽象类实现了该接口中的方法,即给出了方法的具体行为功能。
三、接口回调
接口属于引用型变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。比如,假设Com是一个接口,那么就可以用Com声明一个变量:
Com com;
假设ImpleCom类是实现Com接口的类,用ImpleCom创建名字为obj的对象,那么obj对象不仅可以调用ImpleCom类中原有的方法,而且也可以调用ImpleCom类实现的接口的方法。
ImpleCom obj = new ImpleCom();
其实,接口回调是指:可以把实现某一接口的类创建的对象引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法。
例如,将上述的obj对象的引用赋值给com接口:
com = obj;
注意:接口无法调用类中的其他的非接口方法。
举例:
public interface ShowMessage {
void xssb(String s);
}
public class TV implements ShowMessage{
@Override
public void xssb(String s) {
System.out.println(s);
}
}
public class PC implements ShowMessage{
@Override
public void xssb(String s) {
System.out.println(s);
}
}
public class Test {
public static void main(String[] args) {
ShowMessage sm; //声明接口变量
sm=new TV(); //接口变量中存放对象的引用
sm.xssb("长城牌电视"); //接口回调
sm=new PC(); //接口变量中存放对象的引用
sm.xssb("华硕笔记本电脑");//接口回调
}
}
运行结果:
四、接口与多态
由接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口方法时就可能具有多种形态。
五、接口与abstract类的比较
- abstract 类和接口都可以有abstract 方法。
- 接口中只可以有常量,不能有变量;而abstract 类中既可以有常量,也可以有变量。
- abstract 类中也可以有非abstract 方法,接口不可以。