使用关键字interface来定义一个接口。接口的定义和类的定义很相似,分为接口声明和接口体
接口声明
interface 接口的名字
接口体
接口体中包含常量的声明(没有变量)和抽象方法两部分。接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量的访问权限一定 都是public, 而且是static常量(允.许省略public、final 和static 修饰符),所有的抽象方法的访问权限一定都是public ( 允许省略public abstract修饰符)
接口特点:
1.接口没有构造方法
2.接口不能实例化,但是可以将接口的引用指向其实现类实例
3.一个接口不能实现另一个接口,但可以继承多个其他接口
4.一个类必须实现接口抽象方法(implements),除非这个类也是抽象类.即当这个类是接口的实现类,这个实现类需要重写接口所有的抽象方法,否则这个实现类需要被定义为抽象类
5.实现类可以实现多个接口
使用 implements关键字执行接口、多个接口使用逗号隔开
6.接口中的变量都是静态常量(默认用public static final)必须显式初始化
7.接口的所有方法都是抽象方法 (默认用public abstract修饰)
生活中,我们使用的两相电源插座,规定了:
两个接头间的额定电压
两个接头间的距离
接头的形状
接口是一种约定
有些接口只有名称
面向接口编程
程序设计时面向接口的约定而不考虑具体实现
注意:
接口中的方法在定义好了之后就不要轻易的去修改
因为修改接口中的方法,接口的实现类都要对修改的方法重新操作,非常麻烦
一个类要想增加一个功能,只需要新建一个接口,然后让这个类实现这个新建的接口,就可以用这个接口定义的功能
相同点
代表系统的抽象层
都不能被实例化
都能包含抽象方法
用于描述系统提供的服务,不必提供具体实现
不同点
在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
抽象类便于复用,接口便于代码维护
一个类只能继承一个直接的父类,但可以实现多个接口
使用原则
接口做系统与外界交互的窗口
接口提供服务
接口本身一旦制定,就不允许随意修改
抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点
案例:
接口
- package cn.bdqn.demo03;
-
- public interface USB {
-
- //定义两个方法
-
- void electric();
-
- void data();
-
- }
实现类
- package cn.bdqn.demo03;
-
- public class USBFengShan implements USB {
-
- @Override
- public void electric() {
- System.out.println("风扇获取电能,风扇开始运作.....");
-
- }
-
- @Override
- public void data() {
-
-
- }
-
- public void qqq(){
- System.out.println("我是风扇中独有的方法。");
- }
- }
- package cn.bdqn.demo03;
-
- public class USBMouse implements USB {
-
- @Override
- public void electric() {
- System.out.println("鼠标获取电能,鼠标开始运作....");
-
- }
-
- @Override
- public void data() {
- System.out.println("获取数据传输能力,开始传输数据....");
-
- }
-
- public void test(){
- System.out.println("我是鼠标类中独有方法。");
- }
- }
测试类
- package cn.bdqn.demo03;
-
- public class Test {
-
- public static void main(String[] args) {
- // 接口不能实例化
- //USB usb = new USB();
-
- //直接通过接口的实现类构造方法创建对象
- USBFengShan usbf = new USBFengShan();
- usbf.electric();
- usbf.data();
-
- System.out.println("----------------");
-
- //通过向上转型创建实现类对象
- //向上转型: 父类的引用指向实现类的实例
- USB usb = new USBFengShan();
- usb.electric();
-
- usb = new USBMouse();
- usb.data();
-
- // usb = new USBFengShan();
- // usb.data();
- //接口的引用不能调用实现类中的独有方法,需要进行向下转型
- //usb.test();
- //在向下转型过程中,容易出现类型转换异常(ClassCastException)
- if(usb instanceof USBFengShan){
- USBFengShan usbs =(USBFengShan) usb;
- usbs.qqq();
- }else if(usb instanceof USBMouse){
- USBMouse usbm = (USBMouse) usb;
- usbm.test();
-
- }
-
- }
-
- }