抽象类与接口的区别

在面向对象中有一个概念叫做“抽象类”。正是因为有这个“抽象类”概念的存在,才赋予了面向对象强大的功能,才使它具有了很好的复用性和扩展性。这几天我们一直在研究设计模式,因为好的软件中设计模式(这里的设计模式仅限于面向对象中的设计模式)的使用是必不可少的。但是很多人总觉的设计模式是那么的高大上,是那么高深莫测。其实也不然,设计模式之所以有那么多的优点,无非也就是把我们面向对象中的多态,封装用活了而已。在说的具体点,就是把面向对象中的抽象类用活了所产生的效果。设计模式固然好,但是很多人盲目的去追求设计模式中,出现了这样一个误区。很多人都听说设计模式有多么多么的好,就盲目的去学习设计模式了,一学不要紧,结果看了一遍设计模式,再也不想去看第二遍了。因为在他们看来太难了,结果把自己给整的都吐快了。为何会出现这样的情况呢?经我分析总结,得出一个这样的结论:很多人之所以学不懂设计模式,原因是他们连面向对象基础的东西还没有学懂。比如,最常见的就是,很多人不真正的懂面向对象中的“抽象类”这个概念。因为设计模式是在面向对象的基础上的精炼。几乎所有的都是对抽象类的活用所得。所以他们就没法去学懂设计模式了。

 

之所以很多人摸不透“抽象类”这个概念,是因为他们总会遇到一种这样的情况,他们认为抽象类是两个完全不同的东西,但是很多时候又发现抽象类和接口之间可以相互替换,又好像这两个就是一个东西,越想越矛盾,越矛盾越纠结,越纠结越···其实也没有那么的难不可解,只要我们仔细的去把它们之间的关系理清了,就一切OK了。今天我们就来好好的探讨研究一下这个神奇的“抽象类”。

 

 

一、 概念

 

面向对象中“抽象类”这个概念把它分成了两部分来实现的,有人也叫两种机制。即:抽象类与接口。很多人都认为接口就是接口,和抽象类是两个独立不同的东西,其实不然,接口其实也是抽象类这个概念的一种实现,是一种特殊的抽象类。abstractclass和interface是面向对象语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了面向对象强大的能力。 abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstractclass和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。下面将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。

 

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念。它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

 

在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

 

抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性

 

 

二、 语法

 

  1. 抽象类中可以有抽象方法,也可以有普通方法,抽象方法只可以被声明,不能被实例化(就是不能有方法体),

必须由继承该抽象类的普通类来实例化。

 

  1. 接口中的方法必须都是抽象方法,不可以有普通方法而已。

 

  1. 继承关系,接口是多继承的关系,接口与接口之间是多继承的,类与接口之间是多实现的关系,而抽象类是一个类,由类对他进行单继承,不能多继承,接口不能继承抽象类,但是抽象类可以实现多接口;接口不能继承类或抽象类,但是抽象类可以继承抽象类和普通类。

 

  1. 方法以及属性定义方面,抽象类可以定义任何属性的方法以及实现方法,如private、protected、native等等(当然抽象方法有所限制),但是接口定义的方法不能够有实现,且属性必须为public的实例方法,不能有native等定义等等,接口定义的属性必须是public static final的静态常量。

 

 

小结

 

  1.abstractclass 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

 

  2.在abstractclass中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是staticfinal的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

 

  3.abstractclass和interface所反映出的设计理念不同。其实abstractclass表示的是"is-a"关系,interface表示的是"like-a"关系。

 

  4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

 

  5.接口中定义的变量默认是publicstatic final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

 

  6.抽象类中的变量默认是friendly 型,其值可以在子类中重新定义,也可以重新赋值。

 

  7.接口中的方法默认都是public,abstract 类型的。

 

8. 接口是属于设计后阶段的定义的,用来协同各个模块以及各个功能之间通信与调用定义的。而抽象类是属于开发前阶段定义的,用来实现功能模块的一些基础的或者公有的或者默认的代码,以及规定一些变动功能与实现所需要依赖的规范。

 

 

结论

 

       abstract class 和interface是面向对象语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望读者朋友能够细细体会。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值