日期:2014-05-20  浏览次数:20637 次

Java面试问题之二
接口与抽象类从某个方面来说是非常相似的,请问它们之间有什么异同?

首先,接口是构建松耦合的软件系统的重要法宝。接口仅仅描述了系统能够做什么,而不涉及任何的实现细节,所以接口中所有方法都是抽象的。接口不涉及与任何具体实例相关的细节,因此接口没有构造方法,也不能被实例化,更加没有实例变量。

此外,接口与抽象类都位于系统的抽象层,但两者有着不同的特点和用处。抽象类的优点就是可以为部分方法提供默认的实现,避免了子类对这些方法的重复实现,提高了开发效率和代码的重用程度。但是抽象类有一个比较大的限制就是不能支持多继承。因为子类有可能覆盖抽象类中方法的实现,还有可能隐藏抽象类的成员变量和静态方法。为了简化Java虚拟机的绑定机制,Java语言不允许一个类有多个直接的父类。

这恰恰是接口的优势,接口的优势在于一个类可以实现多个接口。但是接口的局限性是不能提供任何具体的实现。可以把接口作为系统中最高层次的抽象类型。站在外界使用者(另一个系统)的角度来看,接口向使用者承诺提供哪些服务。而站在系统内部角度来看,接口指定系统必须实现哪些服务。系统之间的通过接口进行交流,这样可以进一步降低系统之间的耦合程度。

抽象类可以来定制系统中的扩展点。可以把抽象类看作是介于“抽象”与“实现”之间的半成品。抽象类力所能及地实现了部分通用的实现,留下一些特殊的功能交给其子类自己去实现。