Java 抽象类与接口(2)

接口区别于类,他不是用class来修饰,他用特定的interface关键字,访问修饰符与class一致,可以用public或者缺省。里面只有抽象方法和成员变量两种内容。成员变量会默认添加public static final意为成员变量归类所有,访问权限是最大的,但是不能别继承和修改。这也看出接口是因为不能被实例化,才会这样约定的,接口的成员变量不允许为空,在定义的时候就要赋值给他。 而接口的方法则默认为抽象方法,默认添加public abstract和抽象方法一样,只能写方法声明。
不同于我们用extends去继承一个类,我们用implements 来表示实现这个接口。

class ClassName implements Interface1{ }

接口作为一个特殊的存在,是有一些他的独特的地方的。

一个类是可以实现多个接口的,这在一定程度上实现了Java的多继承。

接口是不能被实例化,不同于抽象类,接口的内部只能由成员变量和抽象方法,是不可以存在静态变量块,以及构造器的。

我们是可以声明一个接口类型的变量,但是只能引用一个实现了这个接口的类。

同抽象方法,实现了接口的类必须实现接口的所有方法,否则就会变成抽象类。

接口举例

看过抽象的例子,我们可能想,我们把Animal从抽象换成接口,不就实现了一个接口的例子嘛,其他地方基本也不用去改动。但这显然是错的。我们并不能去说Animal是一个接口,我们上面说了,接口是一种协议,规定我们能做什么,而不是一个事物的抽象。从这里我们也能看出接口和抽象的不同,抽象更多的是一种重构而产生的东西,我们先有dog,cat类,然后才会把他们共性的东西提取出来,放到一个更通用,更抽象的父类Animal中,而我们发现Animal不需要管run方法是怎么实现的,所以我们将run方法设定为抽象的方法,从而将Animal类设为抽象类,等待去=继承者来实现run。这是一种从下而上的设计思想。但是接口不是,接口一开始就是设定好的,我们根据设定好的接口从上往下去写。接口先规定好了有什么方法,然后我们再去具体实现他。这是一种从上而下的设计思想。
所以,我们不能将Animal设为接口,但是我们可以将Print设为接口,他规定我们有一个print()方法,代码如下:

public interface Print { void print(Object obj); }

那我们就可以写一个新的类去实现这个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); } } 接口总结

接口和抽象虽然都是通过抽象的方法来提供我们实现多态的方式,但是他们却是两个不同的设计思想。这里关于接口的讲解比较简单,关于接口自身的继承,接口内部包含其他接口,以及利用接口来实现回调等等留在以后的文章专门来说。这里主要是通过对比来了解抽象和接口。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/da7bfb5454b6f0ef6082596bf6d2f875.html