详解abstract class和interface的本质

作者&投稿:俟彦 (若有异议请与网页底部的电邮联系)
~     我们知道abstract class和interface的不同在语法定义和编程的角度 这些层面的区别是比较低层次的 非本质的 本小节将从另一个层面 abstract class和interface所反映出的设计理念 来分析一下二者的区别 作者认为 从这个层面进行分析才能理解二者概念的本质所在     前面已经提到过 abstarct class在Java语言中体现了一种继承关系 要想使得继承关系合理 父类和派生类之间必须存在 is a 关系 即父类和派生类在概念本质上应该是相同的(参考文献〔 〕中有关于 is a 关系的大篇幅深入的论述 有兴趣的读者可以参考) 对于interface 来说则不然 并不要求interface的实现者和interface定义在概念本质上是一致的 仅仅是实现了interface定义的契约而已 为了使论述便于理解 下面将通过一个简单的实例进行说明     考虑这样一个例子 假设在我们的问题领域中有一个关于Door的抽象概念 该Door具有执行两个动作open和close 此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型 定义方式分别如下所示     使用abstract class方式定义Door     abstract    class Door {    abstract    void open()     abstract    void close()     }    使用interface方式定义Door     interface Door {    void open()     void close()     }    其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door 看起来好像使用abstract class和interface没有大的区别     如果现在要求Door还要具有报警的功能 我们该如何设计针对该例子的类结构呢(在本例中 主要是为了展示abstract class和interface反映在设计理念上的区别 其他方面无关的问题都做了简化或者忽略)?下面将罗列出可能的解决方案 并从设计理念层面对这些不同的方案进行分析     解决方案一     简单的在Door的定义中增加一个alarm方法 如下     abstract    class Door {    abstract    void open()     abstract    void close()     abstract    void alarm()     }    或者    interface Door {    void open()     void close()     void alarm()     }    那么具有报警功能的AlarmDoor的定义方式如下     class AlarmDoor extends Door {    void open() { … }    void close() { … }    void alarm() { … }    }    或者    class AlarmDoor implements Door {    void open() { … }    void close() { … }    void alarm() { … }    }    这种方法违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple) 在Door的定义中把Door概念本身固有的行为方法和另外一个概念 报警器 的行为方法混在了一起 这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为 报警器 这个概念的改变(比如 修改alarm方法的参数)而改变 反之依然

    解决方案二     既然open close和alarm属于两个不同的概念 根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中 定义方式有 这两个概念都使用abstract class方式定义 两个概念都使用interface方式定义 一个概念使用abstract class方式定义 另一个概念使用interface方式定义     显然 由于Java语言不支持多重继承 所以两个概念都使用abstract class方式定义是不可行的 后面两种方式都是可行的 但是对于它们的选择却反映出对于问题领域中的概念本质的理解 对于设计意图的反映是否正确 合理 我们一一来分析 说明     如果两个概念都使用interface方式来定义 那么就反映出两个问题     我们可能没有理解清楚问题领域 AlarmDoor在概念本质上到底是Door还是报警器?    如果我们对于问题领域的理解没有问题 比如 我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的 那么我们在实现时就没有能够正确的揭示我们的设计意图 因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义     如果我们对于问题领域的理解是 AlarmDoor在概念本质上是Door 同时它有具有报警的功能 我们该如何来设计 实现来明确的反映出我们的意思呢?前面已经说过 abstract class在Java语言中表示一种继承关系 而继承关系在本质上是 is a 关系 所以对于Door这个概念 我们应该使用abstarct class方式来定义 另外 AlarmDoor又具有报警功能 说明它又能够完成报警概念中定义的行为 所以报警概念可以通过interface方式定义 如下所示     abstract    class Door {    abstract    void open()     abstract    void close()     }    interface Alarm {    void alarm()     }    class AlarmDoor extends Door implements Alarm {    void open() { … }    void close() { … }    void alarm() { … }    }    这种实现方式基本上能够明确的反映出我们对于问题领域的理解 正确的揭示我们的设计意图 其实abstract class表示的是 is a 关系 interface表示的是 like a 关系 大家在选择时可以作为一个依据 当然这是建立在对问题领域的理解上的 比如 如果我们认为AlarmDoor在概念本质上是报警器 同时又具有Door的功能 那么上述的定义方式就要反过来了 结论     abstract class和interface是Java语言中的两种定义抽象类的方式 它们之间有很大的相似性 但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解 对于设计意图的反映是否正确 合理 因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能) 这其实也是语言的一种的惯用法 希望读者朋友能够细细体会     对于abstract class和interface的本质区别的内容就向你介绍到这里 希望对你了解和学习abstract class和interface有所帮助 lishixinzhi/Article/program/Java/hx/201311/25893




abstract什么意思
什么是抽象抽象是一种概括性的表述,它可以将一个概念或者事物描述得更加清晰简洁。在英文中,“abstract”一词有多种含义,但最常见的含义就是“抽象的”。因此,“abstract什么意思”的答案就是“抽象”。抽象的定义 在字面上,抽象可以被定义为从一个概念中抽取出来的结果,而这个概念可以是一个事物...

abstract中文是什么意思?
Abstract的中文意思是“摘要”或“抽象”。以下是 摘要的含义:在中文语境中,“抽象”一词通常用来描述一种概括性的、不具体涉及细节的内容。当该词与文章、报告等文本内容结合时,摘要指的是对整篇文章或报告的核心内容、主要观点、研究目的和方法的简短概述。它帮助读者快速了解文本的主题和核心内容,为...

abstract怎么读
abstract 的基本意思是“抽象的,观念上的,理论的”,可与个别情况相对,也可与具体经验相对。多指品质或特征,而不指物体或事实。有时意味着脱离现实,而且缺乏对实际事物的专门实用性,引申可作“难懂的; 过于深奥的”解。abstract用于艺术作品时可指“抽象派的”。abstract作“抽象的”“抽象派的”解时不...

abstract中文翻译
abstract的读音:英 [ˈæbstrækt];美 [ˈæbˌstrækt]释义:adj.抽象的,理论上的;难解的;抽象派的;茫然的;n.抽象概念;抽象派艺术作品;摘要;[化]萃取物;vt.提取,分离;转移(注意等);概括,摘录;剽窃 变形:复数:abstracts过去式:...

abstract什么意思
摘要,实质上是文章精华的缩影,其目的是以不超过100字的篇幅,精炼地概述一篇论文、文章或报告的核心内容。它涵盖背景、目的、方法、成果和结论,旨在让读者在短时间内洞悉全文关键信息,决定是否深入阅读。摘要的价值在于提供快速的阅读指南,无论是对潜在的研究者,还是学术期刊或会议的编辑,它都是理解...

英文摘要是什么意思?
“以英文摘要是什么意思”这个标题所指的是英语学术写作中的“abstract”部分。在论文、报告、文章等文献中,abstract作为对主体内容的简洁概括,给读者提供了快速了解文献内容的途径。通常,abstract都在文献正文之前,写在一个独立的页上,长度一般在150-250个单词之间。一般来说,abstract应该包括论文的主要...

毕业论文abstract怎么写
首先,明白abstract的意义:Abstract:摘要。是对研究论文的简短总结,一般出现在开头部分。Abstract简明扼要地报告了研究目的和结果,是一篇论文中最浓缩的精华。以便读者能够快速而确切地知道这篇论文所描述的研究工作是关于什么的。其次,Abstract需要说清楚四件事:本文研究问题和目标:Abstract首先要明确论文...

解释一下:abstract="true",parent="baseDao",name="target"这三个东西...
Abstract(抽象)可以修饰类、方法 如果将一个类设置为abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。 Abstract可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性。 Abstract虽然不能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型。 Final和abstract...

abstract怎么读英语
abstract读作[ˈæbstrækt],意思是摘要。摘要又称概要、内容提要,意思是摘录要点或摘录下来的要点。摘要是以提供文献内容梗概为目的,不加评论和补充解释,简明、确切地记述文献重要内容的短文。其基本要素包括研究目的、方法、结果和结论。具体地讲就是研究工作的主要对象和范围,采用的...

请问abstract是什么意思?
abstract意思楼上的已经解释了,抽象类中可以没有抽象方法,抽象类也不能实例化。还有abstract方法所在的类必须用abstract修饰 评论| 2013-10-04 22:00热心网友 n.摘要, 概要, 抽象adj.抽象的, 深奥的, 理论的vt.摘要, 提炼, 抽象化满意请及时采纳为满意答案 !!! 评论| 2013-10-05 00:04还是没有红|四级 ...

望都县18214308556: 回答什么是abstract class,什么是interface,两者有什么区别 -
鄣勤力博: 含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的.abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不...

望都县18214308556: abstract class和interface有什么区别? -
鄣勤力博: 区别如下:1. 相同点 两者都是抽象类,都不能实例化.interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法.2. 不同点 interface需要实现,要用implements,而abstract class需要继承,要用extends.一个类可以实现多个...

望都县18214308556: 请问大神谁知道abstract class和interface有什么区别? -
鄣勤力博: 1.abstract class 在Java中表示的是一种继承关系,一个类只能使用一次继承关系.但是,一个类却可以实现多个interface.2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的方法,而在interface中,只能够有静态的不能被修改...

望都县18214308556: java 中abstract class和interface有什么区别 -
鄣勤力博: abstract 修饰的CLASS是抽象类 抽象类(abstract class)可以有抽象方法,也可以有具体是方法,抽象类只能支持单继承 interface 接口 接口可以有抽象的方法,不存在具体的方法,接口可以多继承(多实现) 如下是我以前学习的一些笔记你可...

望都县18214308556: interface和abstract class的三个区别 -
鄣勤力博: 展开全部1.interface的所有函数都是abstract的;2.interface的数据成员默认都是public static final的;3.Interface可以被多继承,abstract class单继承

望都县18214308556: java中abstract怎么使用 -
鄣勤力博: abstract是一个定义抽象类的关键字,你可以abstract class AA{}这样去定义一个类,也可以abstract void method();去定义一个方法,可是定义这个方法所在的类也必须是抽象类,也就是前面的定义AA那样去定义那个类了,这里权限修饰符我就没加了,你看需求加

望都县18214308556: Java中abstract class和interface有什么区别? -
鄣勤力博: 在java中不允许一个类继承多个多个父类,但是要实现“一个类继承多个类的功能”就可以用接口,一个类实现多个多个接口从而间接实现多重继承. 从本质上讲,接口也是是一种抽象类.这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现. 多个无关的类可以实现同一个接口.一个类可以实现多个无关的接口.与继承关系类似,接口与实现类之间存在多态性.java提供的接口都在相应的包中,通过引入包可以使用java提供的接口.也可以自己定义接口,一个java源文件就是由类和接口做成的.

望都县18214308556: java中abstract class和interface有什么区别?请举个例子,再加以说明?
鄣勤力博: interface是一种极端的抽象类,所有方法全都是抽象的.所有属性都是常量 static final的. 而abstract是一种抽象类,所谓抽象类是指他又抽象方法就是抽象类,不用所有方法都抽象. public interface A{ void print(); void println(); } public abstract class B{ void print(); void println(){System.out.println("可以有非抽象方法"); } }

望都县18214308556: PHP5中interface 和 abstract class 的区别 -
鄣勤力博: 1. 相同点: (1) 两者都是抽象类,都不能实例化. (2) interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法. 2. 不同点: (1) interface 需要实现,要用 implements ,而 abstract class 需要继承,要用 extends . (2) 一...

望都县18214308556: 什么是抽象类(abstract class)?
鄣勤力博: 1. 什么是抽象类抽象类仅提供一个类型的部分实现.抽象类可以有实例变量,以及一个或多个构造函数.抽象类可以同时有抽象方法和具体方法.一个抽象类不会有实例,这些构造函数不能被客户端调用来创建实例.一个抽象类的构造函数可以...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网