=================《疯狂Java讲义精粹》读书笔记9 ------ 接口=====================
接口是从多个相似的类中抽象出来的规范,接口不提供任何实现。它体现的是一种规范和实现分离的设计哲学。
· 接口可以是public 或者省略,不能用其他访问修饰符修饰
· 接口应与类名采用相同的命名规则
· 一个接口可以有多个直接的父接口,但接口只能继承接口,不能继承类
· 接口里面包含成员变量,但只能是常量用 static final 修饰,缺省时系统会自动添加static final
· 接口里面的方法只能是抽象方法用public abstract 修饰,缺省时系统会自动补全
· 接口里不允许定义静态方法
· 一个类可以继承一个父类,并同时实现多个接口,implements 部分必须放在 extends后面
· 一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的去全部抽象方法;否则,该类也必须定义为抽象类
下面看一个实现接口的类:
/** * 一个简单的接口实现 * @author 《疯狂的Java讲义精粹》 * */ /** * 定义Output 接口 */ interface Output{ int MAX_CACHE_LINE = 50; void out(); public abstract void getData(String msg); } /** * 定义Product接口 */ interface Product { int getProductTime(); } public class TtestInterface implements Product, Output{ 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 { printData[dataNum++] = msg; } } public int getProductTime(){ return 45; } public static void main(String[] args) { Output o = new TtestInterface(); o.getData("欢迎来到博客园"); o.getData("我是CocoonFan"); o.out(); Product p = new TtestInterface(); System.out.println(p.getProductTime()); } }
输出结果:
打印机打印:欢迎来到博客园
打印机打印:我是CocoonFan
45
接口和抽象类很像:
· 接口和抽象类都不能被实例化,他们都位于继承树的顶端,用于被其他类继承和实现
· 接口和抽象类都可以包含抽象方法,实现接口和继承抽象类的普通子类都必须实现这些抽象方法
· 接口体现一种规范,是多个模块间的耦合标准,抽象类体现一种模板式设计。
在用法上:
· 接口只能包含抽象方法,不包含已经提供实现的普通方法;抽象类则完全可以包含普通方法
· 接口里不可以定义静态方法;抽象类里面可以定义静态方法
· 接口里面不含构造器;抽象类里面可以包含构造器(让其子类调用)
· 接口里不能包含初始化块;但抽象类可以包含初始化块
· 一个类最多只能有一个直接父类,但一个类可以实现多个继承(通过这种方式来解决多继承问题)