看了一下java tutorial里面对接口的定义,底下附1:借口是抽取相互之间没有关系的类的共同特征,而不用去关注类之间的关系。
我觉得这个是借口和抽象类最关键的区别,接口是希望一组没有层次关系的类之间可以拥有共同的行为,而抽象类作为父类的话,自然希望其子类在逻辑上和父类是有一定的关系的。比如说一个抽象类,bird,里面有fly这个方法。我们现在想设计一架飞机也可以飞,虽然我们可以让plane这个类继承bird这个抽象类,但是这两个完全是风马牛不相及的东西,自然不应该有继承关系了。但如果是接口设计的话,我们可以设计出一个flyable的接口,里面定义fly的方法,因为bird和plane都可以飞,所以我们可以让鸟和飞机类去implement这个flyable的接口,然后各自实现不同的fly的方法。
java tutorial还有一个例子,比如说商店有若干种商品,各种商品之间一般不会有什么继承关系,但是现在店主希望管理各种商品,所以店主希望所有的商品都实现一种可以称为manageable的接口,里面包含用于管理的一些方法和属性,如价格、索引号这样的属性或者设置零售价格这样的方法。这样接口就巧妙的将各种不相关的类联系起来了。如果各种各样的商品类implement了manageable接口,那么店主只需要面向manageable这个接口就可以管理各种商品了,而不需要考虑各种商品之间是否有什么层次关系。所以接口给编程以极大的灵活性,而常说的面向接口编程大概是这个意思吧。
Java中还有一些常用街口,比如说comparable接口,任何类只要实现了这个接口,都可以被compare。(好像是这样,不确定,有错请指出)。Java中还有什么比较常用的接口呢?
附2、4个人感觉都是基于1的。不过附3,看不太懂,是什么意思。附4讲到了可以通过接口实现多重继承,不过个人感觉接口志不在此,只是在语法上达到了这样的效果(编程经验不丰富,所以想当然这么认为,大家指正一下)
总结一下,抽象类是一种类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象。而接口则是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象。
附:You use an interface to define a protocol of behavior that can be implemented by any class anywhere in the class hierarchy. Interfaces are useful for the following:
1.Capturing similarities among unrelated classes without artificially forcing a class relationship
2.Declaring methods that one or more classes are expected to implement
3.Revealing an object's programming interface without revealing its class
4.Modeling multiple inheritance, a feature of some object-oriented languages that allows a class to have more than one superclass