一概念介绍
1接口可以用于声明引用类型的变量,但接口不能用于创建实例。
2当使用接口来声明引用类型变量时,这个引用类型变量必须引用其实现类的对象。
3一个类可以实现一个或多个接口,实现接口用implements关键字。
4一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法,否则,该类将保留从父接口那里继承到的抽象方法,该类也必须定义为抽象类。
二实现接口的类应用
1代码示例
Output.java
public interface Output { // 接口里定义的成员变量只能是常量 int MAX_CACHE_LINE = 50; // 接口里定义的普通方法只能是public的抽象方法 void out(); void getData(String msg); // 在接口中定义默认方法,需要使用default修饰 default void print(String... msgs) { for (String msg : msgs) { System.out.println(msg); } } // 在接口中定义默认方法,需要使用default修饰 default void test() { System.out.println("默认的test()方法"); } // 在接口中定义类方法,需要使用static修饰 static String staticTest() { return "接口里的类方法"; } }
Printer.java
// 定义一个Product接口 interface Product { int getProduceTime(); } // 让Printer类实现Output和Product接口 public class Printer implements Output , Product { private String[] printData = new String[MAX_CACHE_LINE]; // 用以记录当前需打印的作业数 private int dataNum = 0; public void out() { // 只要还有作业,继续打印 while(dataNum > 0) { System.out.println("打印机打印:" + printData[0]); // 把作业队列整体前移一位,并将剩下的作业数减1 System.arraycopy(printData , 1 , printData, 0, --dataNum); } } public void getData(String msg) { if (dataNum >= MAX_CACHE_LINE) { System.out.println("输出队列已满,添加失败"); } else { // 把打印数据添加到队列里,已保存数据的数量加1。 printData[dataNum++] = msg; } } public int getProduceTime() { return 45; } public static void main(String[] args) { // 创建一个Printer对象,当成Output使用 Output o = new Printer(); o.getData("Linux"); o.getData("Java"); o.out(); o.getData("软件设计"); o.getData("信息安全"); o.out(); // 调用Output接口中定义的默认方法 o.print("林冲" , "武松" , "宋江"); o.test(); // 创建一个Printer对象,当成Product使用 Product p = new Printer(); System.out.println(p.getProduceTime()); // 所有接口类型的引用变量都可直接赋给Object类型的变量 Object obj = p; } }
2运行结果
F:\java\workspace\java6\src>java Printer
打印机打印:Linux
打印机打印:Java
打印机打印:软件设计
打印机打印:信息安全
林冲
武松
宋江
默认的test()方法
45
3结果分析
Printer类实现了Output接口和Product接口,因此Printer对象既可直接赋给Output变量,也可直接赋给Product变量。仿佛Printer类既是Output类的子类,也是Product类的子类,这就是Java提供的模拟多继承。
Printer实现了Output接口,即可获取Output接口中定义的print()和test()两个默认方法,因此Printer实例可以直接调用这两个默认方法。