写在前面
有时发呆,会在心里给自己提些问题,哇擦,好无耻,基础好差,Java的一些基础知识居然差不多都还给老师了,遂下定决心,把一些知识点再回顾总结下!
问1:接口有什么作用?
在知乎上看到的一个隐喻解释很形象,通俗易懂,这里引用一下,原文见:https://www.zhihu.com/question/20111251
接口就是个招牌。
比如说你今年放假出去杭州旅游,玩了一上午,你有点饿了,突然看到前面有个店,上面挂着KFC,然后你就知道今天中饭有着落了。KFC就是接口,我们看到了这个接口,就知道这个店会卖炸鸡腿(实现接口)。那么为神马我们要去定义一个接口涅,这个店可以直接卖炸鸡腿啊(直接写实现方法),是的,这个店可以直接卖炸鸡腿,但没有挂KFC的招牌,我们就不能直接简单粗暴的冲进去叫服务员给两个炸鸡腿了。要么,我们就要进去问,你这里卖不卖炸鸡腿啊,卖不卖汉堡啊,卖不卖圣代啊(这就是反射)。很显然,这样一家家的问实在是非常麻烦(反射性能很差)。要么,我们就要记住(很多实现类),中山路108号卖炸鸡,黄山路45号卖炸鸡(硬编码),很显然这样我们要记住的很多很多东西(代码量剧增),而且,如果有新的店卖炸鸡腿,我们也不可能知道(不利于扩展)。
使用接口,主要是为了达到“对修改封闭,对扩展开放 “原则。
接口与类相似点
- 一个接口可以有多个方法。
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
- 接口的字节码文件保存在 .class 结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中。
接口与类的区别
- 接口不能用于实例化对象。
- 接口中所有的方法必须是抽象方法。 (下面有解释)
- 接口不能包含成员变量,除了 static 和 final变量。
- 接口支持多继承。
接口特性
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
抽象类和接口的区别
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
标记接口
最常用的继承接口是没有包含任何方法的接口。
标识接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。
标识接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。
例如:java.awt.event
包中的 MouseListener 接口继承的 java.util.EventListener
接口定义如下:
package java.util;
public interface EventListener
{
}
没有任何方法的接口被称为标记接口。标记接口主要用于以下两种目的:
- 建立一个公共的父接口:
正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。
- 向一个类添加数据类型:
这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型
接口知识总结
我们知道,接口不能实例化,但是在web开发中,经常遇到在action层声明service变量,形式如下:
private Collection co;
用接口声明的变量称为接口变量,接口属于引用型变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。
这是一种声明,实例化还是使用该接口的实现类,即:
Collection co = new ArrayList();
使用接口是为了抽象系统的某种公共行为,或者封装变化性,进行系统设计的时候你需要抽取出接口,这样将来你的系统将更加灵活。尝试进行接口和实现分离,面向接口编程。