抽象类与接口的区别

抽象类与接口的区别

语法层次

抽象类的定义,如下所示:

// 抽象类中可以包含抽象方法与非抽象方法(必须给出实现)
public abstract class Demo 
{
    abstract void foo1();
    void foo2(){
        //实现
    }
}

接口的定义,如下所示:

interface Demo
{
    // 接口中的方法自动转为public abstract
    void foo1();
    void foo2();
}

抽象类方式中,抽象类可以拥有任意范围的成员数据,同时也可以拥有自己的非抽象方法,但是接口方式中,它仅能够有静态、不能修改的成员数据(即final static,但是我们一般是不会在接口中使用成员数据),同时它所有的方法都必须是抽象的。在某种程度上来说,接口是抽象类的特殊化。

设计层次

从设计的层面来看,我觉得抽象类与接口有如下几个不同点:

  1. 抽象层次不同。可以这样理解,抽象类是对类的抽象,接口是对行为的抽象。抽象类对是类整体进行抽象,包括属性、行为,而接口是对类局部(行为)进行抽象。
  2. 跨域不同。抽象类所跨域的是具有相似特点的类,而接口可以跨域不同的类。抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a" 关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已。

总结

  1. 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。
  2. 在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。
  3. 抽象类和接口所反映的设计理念是不同的,抽象类所代表的是"is-a"的关系,而接口所代表的是"like-a"的关系。抽象类和接口是java语言中两种不同的抽象概念,他们的存在对多态提供了非常好的支持,虽然他们之间存在很大的相似性。但是对于他们的选择往往反应了您对问题域的理解。只有对问题域的本质有良好的理解,才能做出正确、合理的设计。



文/zhutoulwz(简书作者)
原文链接:http://www.jianshu.com/p/2b5a9bdcd25f
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
posted @ 2016-07-18 14:44  alsdf  阅读(209)  评论(0编辑  收藏  举报