接口是一种引用数据类型,用interface声明 语法:
public interface name{ }
接口的特性
(1)接口中可以声明属性和方法(实际应用比较少,不多说)
属性都是final和static类型的;
方法都是公共的抽象方法
(2)接口不能有构造方法,不能用于创造对象
(3)接口可以多继承,一个借口可以继承多个其他接口
(4)一个类可以实现一个或多个接口的所有抽象方法,那么这个类也可以称为接口的实现类
一个类继承一个父类,实现多个接口,继承在前,接口在后(特殊情况:如果这个父类里面定义了和接口里一样的抽象方法,那么最后实现的是父类里的抽象方法)
接口的应用
(1)接口表示一种能力,接口让实现类实现这些能力,同时实现类自己也得到拓展
package cn.sxt.interface03; // 驾驶接口 public interface DriveInterface {
// 驾驶的方法 public void drive(); }
package cn.sxt.interface03; //学生实现了上面接口的抽象方法(驾驶) public class Student implements DriveInterface{ ////… public void learn(String cName) { System.out.println(this.name+"正在学习"+cName); } @Override public void drive() { System.out.println(this.name+"正在驾驶..."); } }
package cn.sxt.interface03; //教师实现了接口的抽象方法(驾驶) public class Teacher implements DriveInterface{ /// … @Override public void drive() { System.out.println(this.name+"正在学习驾驶技术..."); System.out.println(this.name+"很快学会了飙车..."); } }
(2)接口实现多态(从下面这段代码的形式来看就和面向对象的多态很像)
public class Test01 { public static void main(String[] args) { // 同一引用类型 USBInterface usbInterface = null; // 实例不同 usbInterface = new USBFan(); // 对同一方法的执行结果不同 usbInterface.connect(); usbInterface = new USBMouse(); usbInterface.connect(); usbInterface = new USBDisk(); usbInterface.connect(); } }
区别:
接口实现多态: 接口类型 引用 实现类对象
继承实现多态: 父类类型 引用 子类对象
接口定义的方法被实现类实现,通过接口引用实现类时,调用接口中的方法时,执行的是实现类实现的方法。
实现类对象具备接口中定义的能力 是一种has a 关系
子类对象是一种父类类型 是一种is a 关系
(3)面向接口编程
通俗理解面向接口编程:接口的定义方只关心接口能不能被实现,不关心怎样实现的。
理解:
=>实现类必须实现接口中所有的方法,所以接口规范了实现类的行为
=> 接口约定了实现类应该具备的行为
//给打印机设置接口
public class Writer { // 预留墨盒接口 private InkBoxInterface inkBoxInterface; // 预留纸张接口 private PaperInterface paperInterface; public InkBoxInterface getInkBoxInterface() { return inkBoxInterface; } public void setInkBoxInterface(InkBoxInterface inkBoxInterface) { this.inkBoxInterface = inkBoxInterface; } public PaperInterface getPaperInterface() { return paperInterface; } public void setPaperInterface(PaperInterface paperInterface) { this.paperInterface = paperInterface; } public Writer(InkBoxInterface inkBoxInterface, PaperInterface paperInterface) { super(); this.inkBoxInterface = inkBoxInterface; this.paperInterface = paperInterface; } public Writer() { super(); } public void print(String content) { System.out.println("打印机正在使用"+this.inkBoxInterface.getColor()+"颜色打印"+this.paperInterface.getSize()+"打印"+content); } }
抽象类和接口的异同:
- 抽象类和接口都是引用数据类型,他们都不能创建对象。
- 他们都可以定义抽象方法,都可以实现多态。但是抽象类可以定义非抽象方法,而接口中定义的都是抽象方法。
- 抽象类和接口都具有传递性。抽象类是单根性(单继承),而接口是多继承。
- 在概念上,都可以重写抽象方法。子类重写抽象类,实现类实现接口
抽象类和子类解决的是模块内的问题(代码重用,重写,多态)而接口解决的是模块间的问题 => 高内聚,低耦合。接口可以用解耦模块