使用关键字interface来定义一个接口。接口的定义和类的定义很相似,分为接口声明和接口体
接口声明
interface 接口的名字
接口体
接口体中包含常量的声明(没有变量)和抽象方法两部分。接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量的访问权限一定 都是public, 而且是static常量(允.许省略public、final 和static 修饰符),所有的抽象方法的访问权限一定都是public ( 允许省略public abstract修饰符)
接口特点:
1.接口没有构造方法
2.接口不能实例化,但是可以将接口的引用指向其实现类实例
3.一个接口不能实现另一个接口,但可以继承多个其他接口
4.一个类必须实现接口抽象方法(implements),除非这个类也是抽象类.即当这个类是接口的实现类,这个实现类需要重写接口所有的抽象方法,否则这个实现类需要被定义为抽象类
5.实现类可以实现多个接口
使用 implements关键字执行接口、多个接口使用逗号隔开
6.接口中的变量都是静态常量(默认用public static final)必须显式初始化
7.接口的所有方法都是抽象方法 (默认用public abstract修饰)
接口是一种约定生活中,我们使用的两相电源插座,规定了:
两个接头间的额定电压
两个接头间的距离
接头的形状
接口是一种约定
有些接口只有名称
面向接口编程
程序设计时面向接口的约定而不考虑具体实现
注意:
接口中的方法在定义好了之后就不要轻易的去修改
因为修改接口中的方法,接口的实现类都要对修改的方法重新操作,非常麻烦
一个类要想增加一个功能,只需要新建一个接口,然后让这个类实现这个新建的接口,就可以用这个接口定义的功能
抽象类vs接口相同点
代表系统的抽象层
都不能被实例化
都能包含抽象方法
用于描述系统提供的服务,不必提供具体实现
不同点
在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
抽象类便于复用,接口便于代码维护
一个类只能继承一个直接的父类,但可以实现多个接口
使用原则
接口做系统与外界交互的窗口
接口提供服务
接口本身一旦制定,就不允许随意修改
抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点
案例:
接口
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();
}
}
}