Java 深入接口和抽象类

没能不能,只有肯不肯。


一个软件的好坏,很大程度上取决于它的整体架构,整体架构其实可以看成对业务的一种架构框架的抽象,当代表逻辑设计的整体框架做好之后,底层的具体实现只需要考虑完成相应算法和一些基础的业务实现就可以了。当你需要开发另一个类似的项目时,以前的抽象框架层说不定可以再次使用。面向对象设计重要的是对抽象层的复用,而不是某一代码块的复用。

在面向对象编程中,抽象是它的一大特征,有两种抽象类型来体现OOP的抽象:接口和抽象类。它们有太多相似的地方,导致有些人会认为接口和抽象类可以互换,但并不然,接口和抽象类的区别还是蛮大的。

OOP面向对象的编程,如果要提高程序的复用率、可维护性和可扩展性,就要面向接口编程或 面向抽象类编程,把接口和抽象类作为程序抽象架构层中的顶端。

接口

接口在设计的初衷其实是对行为的抽象,在接口中可以定义变量以及方法,变量默认指定为              public static final ,方法为抽象方法,默认指定为 public abstract ,不可以有方法的实现,由实现该接口的类去实现该方法,并且接口中所有方法必须为抽象方法。从这里看出接口是一种极具抽象的类型,它比抽象类更“抽象”。

抽象类

顾名思义,包含抽象方法的类成为抽象类(但如果一个类中没有抽象方法,只用abstract修饰类,该类也为抽象类,也不能实例化),正因为抽象类中包含了没有具体实现的方法,所以抽象类不能实例化。如果一个类继承了抽象类,就要实现抽象类中所有的抽象方法。包含抽象方法的类成为抽象类,但并不是抽象类中全都是抽象方法,它也可以有成员变量和成员方法。

抽象类和普通类的区别

1、抽象类不能实例化,也就是不能用来创建对象。

2、抽象类只能用 public 或 protected 来修饰,因为如果用 private,那抽象类就不能被继承,也就失去了意义,什么也做不了。

3、抽象类被子类继承后,子类必须实现其所有的抽象方法,如果没有实现父类的抽象方法,则子类得定义为抽象类。

语法上抽象类和接口的区别

1、抽象类和接口之间最大的区别就是抽象类中可以有方法的实现,也可以有方法的定义,但接口中只能有方法的定义,不能有方法的具体实现。这是抽象类的优点,非常有用。(你给一个抽象类加一个具体实现的方法,那继承与这个抽象类的子类也就默认拥有了这个具体方法。如果是接口的话,就只能在接口中定义这个新方法,所有实现了这个接口的类就不能通过编译,只能将每个实现了这个接口的类来实现这个新方法才行,这显然是Java接口的缺点)在某些情况下抽象类更容易扩展。

2、抽象类的实现只能由继承于它的子类来给出,所以这就要讲Java的单继承,一个类只能继承一个抽象类,作为一个抽象工具来说,效能会大打折扣。接口在这方面会比抽象类好很多,Java中一个类可以实现多个接口,从而这个类就具有了多种类型。可以看出接口是一个定义混合类型的理想工具,混合类型表示这个类不仅具有某个主类型的行为,还具有其他类型的行为。

3、接口中不能出现静态方法和静态代码块,抽象类中可以出现静态方法和静态代码块(关于为什么学了以后在回答,知道的告知下)。

通过以上几点,一个经典的设计模式就出来了:声明类型的工作仍然由接口来承担,这里我们给出一个抽象类,且实现了这个接口,而具体类可以选择实现接口,也可以选择继承抽象类,在层次结构中,接口是在最顶层,抽象类则在接口的下一层。这两个抽象类型的优点都能有所发挥,这就是  "缺省适配模式"。当你只想实现接口中一个或几个方法,而不想全都实现,这个设计模式能完美解决这个问题。

接口和抽象类本身就是为了被具体类实现或者继承。如果在实际开发中,你准备使用具体类来继承具体类,那你的设计就有很大问题了。

设计上接口与抽象类的区别

抽象类是对事物本身的抽象,接口是对事物行为的抽象。什么意识呢?举个简单的例子:人和鱼,他们都会游泳,我们可以把人(People类)和鱼(Fish类)都单独设为一个类,但游泳是一种行为所以可以创建一个接口Swim,里头有个抽象方法 swim(),然后我们用People类和Fish类实现这个接口,至于程序员、架构师或者鲨鱼、鲸鱼这种不同身份的人和不同种类的鱼,只需要继承于People类或者Fish类就可以了,从这里我们可以看出,继承是"是不是"的关系(程序员是不是人),而接口是“有没有”的关系(人有没有游泳的行为)。如果一个类继承于抽象类,那这个类就是抽象类的种类,而实现接口是“有没有”的关系,例如:人是否会游泳?,会游泳就实现这个接口,否则就不实现。

下面给一个网上流传广泛的例子:门和警报。门都有close()和open()两个行为,我们可以分别用抽象类和接口区定义它。


如果这时需要在门上安装警报功能,我们提供两种方案:

1、把三个功能都放进接口中,万一有个类只需要警报功能,不需要open()和close(),例如警报器,但实现了这个接口后,它三个功能都有了,这样的设计显然是不行的。

2、把三个功能都放进抽象类中,那只要继承了抽象类的子类都具有了警报的功能,但有的门不具备警报功能,这样也显然不行。

因为open()和close()是门的固有行为,警报是附加的行为。不如我们试试把open()和close()放在Door抽象类中,把警报功能单独放在Alarm接口中,然后设计一个警报门继承Door抽象类然后实现Alarm接口。


本文主要参考于:http://www.cnblogs.com/dolphin0520/p/3811437.html

http://blog.csdn.net/xw13106209/article/details/6923556

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容