代码改变世界

我对接口与抽象类的理解

2011-02-20 00:43  java线程例子  阅读(175)  评论(0编辑  收藏  举报

1、从编程思想上来讲,抽象类首先是类,具有分类学的意义,有两层含义,一是以研究对象的整体来划分的,二是互斥性。类一定存在具体的对象才有意义。分类一般采用树型层级进行。一般情况下,上一层分类都是对下一层分类的分类。而接口表达的是一种标准,本身不具有分类学意义,但可以作为一种分类的属性。接口是从对象的局部特征或者功能来进行的,但它并不代表对象。因此类表述的是一种“是(IS)”的概念,而接口表述的是一种“具有”或者“拥有”(HAS)的概念。至于抽象的概念,严格的讲,在这个层次上,类本身就是一种抽象。但我们也可以把抽象类看作是对类本身的分类,在分类层级上,处于枝节点,而普通类处在叶子节点上。(理解类的时候不要从生物学的继承来理解,类的继承只是借用了这个生物学概念)

2、从语言级实现层面上来讲,一般抽象类不能实例化,接口也不能实例化(接口本身也不具有实例化的意义).作为类来讲,一般语言不支持类的多继承,大多支持类实现多个接口(这主要是为了实现和理解)。一般来讲,两者的应用场景是不一样的。但如果偷换概念的相互替代,从编程的技术实现上来讲是可以的,但不利于理解。

另外,很多书中提到的面向对象编程中的面向接口编程的原则(多用接口,少用继承),其实如果按照接口和类的内涵来讲,这个原则提得有些牵强,一是没有定量性标准,二是容易误导开发人员。接口和类的使用应该是如果表达的是一种"IS"的关系就用继承(类),如果表达的是一种“Has"则用接口。