接口区别于类,他不是用class来修饰,他用特定的interface关键字,访问修饰符与class一致,可以用public或者缺省。里面只有抽象方法和成员变量两种内容。成员变量会默认添加public static final意为成员变量归类所有,访问权限是最大的,但是不能别继承和修改。这也看出接口是因为不能被实例化,才会这样约定的,接口的成员变量不允许为空,在定义的时候就要赋值给他。 而接口的方法则默认为抽象方法,默认添加public abstract和抽象方法一样,只能写方法声明。
不同于我们用extends去继承一个类,我们用implements 来表示实现这个接口。
接口作为一个特殊的存在,是有一些他的独特的地方的。
一个类是可以实现多个接口的,这在一定程度上实现了Java的多继承。
接口是不能被实例化,不同于抽象类,接口的内部只能由成员变量和抽象方法,是不可以存在静态变量块,以及构造器的。
我们是可以声明一个接口类型的变量,但是只能引用一个实现了这个接口的类。
同抽象方法,实现了接口的类必须实现接口的所有方法,否则就会变成抽象类。
接口举例看过抽象的例子,我们可能想,我们把Animal从抽象换成接口,不就实现了一个接口的例子嘛,其他地方基本也不用去改动。但这显然是错的。我们并不能去说Animal是一个接口,我们上面说了,接口是一种协议,规定我们能做什么,而不是一个事物的抽象。从这里我们也能看出接口和抽象的不同,抽象更多的是一种重构而产生的东西,我们先有dog,cat类,然后才会把他们共性的东西提取出来,放到一个更通用,更抽象的父类Animal中,而我们发现Animal不需要管run方法是怎么实现的,所以我们将run方法设定为抽象的方法,从而将Animal类设为抽象类,等待去=继承者来实现run。这是一种从下而上的设计思想。但是接口不是,接口一开始就是设定好的,我们根据设定好的接口从上往下去写。接口先规定好了有什么方法,然后我们再去具体实现他。这是一种从上而下的设计思想。
所以,我们不能将Animal设为接口,但是我们可以将Print设为接口,他规定我们有一个print()方法,代码如下:
那我们就可以写一个新的类去实现这个Print接口。代码如下:
public class SimplePrint implements Print{ @Override public void print(Object obj) { ((Animal)obj).run(); } }除了Test类以外,其他地方都不需要改变。我们Test类代码如下:
public class Test { public static void main(String[] args) { Animal dog = new Dog(); Animal cat = new Cat(); Print print = new SimplePrint(); print.print(dog); print.print(cat); } } 接口总结接口和抽象虽然都是通过抽象的方法来提供我们实现多态的方式,但是他们却是两个不同的设计思想。这里关于接口的讲解比较简单,关于接口自身的继承,接口内部包含其他接口,以及利用接口来实现回调等等留在以后的文章专门来说。这里主要是通过对比来了解抽象和接口。