`
wangdi
  • 浏览: 75811 次
  • 性别: Icon_minigender_1
  • 来自: 不要订阅我啦!!
社区版块
存档分类
最新评论

关于abstract class和interface

阅读更多
Java的interface和abstract class都可以定义不提供具体实现的方法。其中一个类不能继承自多个abstract class,但是可以实现多个interface。Java的类没有多重继承,所以用interface的概念来补充,通过实现多个interface来实现多重的继承。

在Java中所有的对象都用类来描绘,但是不是每一个类都用来描绘对象的。用来描绘某一类对象共有的本质,这就是抽象。比如:形状存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类(这儿的抽象类并不是abstract class翻译而来的,它包括interface和abstract class)是不能够实例化的。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。

从语言层面上面来讲:abstract class可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,只能够有静态的不能被修改的数据成员(也即interface是static final的),所有的成员方法都是abstract的。从这种角度来说,interface是abstarct class的一种特殊情况。abstract class可以提供某些方法的部分实现,而interface不可以,这大概就是abstract class唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而interface做不到这一点,如果向一个interface里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行。

而从设计出发:假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:
abstract class:
abstract class Door{
    abstract void open();
    abstract void close();
}

interface:
interface Door{
    void open();
    void close();
}

其他具体的Door类型extends absract class或者implements interface就可以了。
看起来好像使用abstract class和interface没有大的区别。

但是现在如果要求Door加上报警的alarm功能,我们应该如何去设计程序的结构呢?
方案一、简单的在abstract class添加abstract void alarm()方法或者在interface中加一个alarm()方法?但是如果这样,在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变。
方案二、既然open()、close()和alarm()是属于两个不同的概念,那么就应该分两个模块来设计。那,这样是应该分成两个abstract class、两个interface还是一个abstract class一个interface呢?
在java中,类是不支持多重继承的,所以,第一种方式不行,第二种方式,用两个interface来描绘:当我们明白AlarmDoor是属于alarm或者door的一种的时候,它会有一个侧重点,用两个相同的interface来描绘,很明显是不能够描绘出来问题的特点的。假设AlarmDoor是属于一个具有报警功能的Door,那么它本质上来说,是一个Door,不过是附加了alarm()的功能而已。所以对于Door的概念我们应该用一个abstract class去描绘,而alarm()的功能则用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(){...}
}


BTW:文章借鉴了csdn的jackrong的一篇文章的例子(原文地址已经不知道了),而本身对于abstarct class和interface的理解有一部分也来自这个文章,当是我模仿加抄袭写成的文章吧。初学Java,对概念确实达不到一个高度的认识,只有通过这样的方式,希望今后可以慢慢提高……
分享到:
评论
11 楼 cavenaghi 2007-03-02  
貌似简单的东西,都很深奥,感谢楼主用精辟的话语解释了他们的区别
10 楼 moshalanye 2007-03-02  
    抽象类给我的感觉是未完成的类,但是类中某些属性和属性方法已经有了很好的实现或是解决方法,只是有部分东西不大清晰或是要看待具体情况来说,所以使用抽象方法把这个类补完。
    而接口用处则大的多,面向接口编程对可插拔给予了强大的支持,在回调成员对象得到了同接口不同实现的方便。在一个功能类比较大的时候面向接口编程还可以防止编写方法的遗漏,和在编写实现之前就可以在接口中定义所有属性的好处(好比一个清单)。
    但对与说继承少写代码这个说法则不是太好,继承的东西会死在你的代码里面,成为你的一部分,有变动后不方便修改,特别是对于增加某个东西的功能,并不是非要用继承,在新的类中将该功能的接口类的实现作为成员,这样就可以方便的想要什么加什么,修改维护也变的简单。
    在现实的世界中也是将分工变的越来越细,一个强大功能的东西往往是多个专注于某个方向的东西组成的,计算机语言也是在模拟,特别是这些好的想法和认识。
    (纯属个人学习后的想法,不对的地方希望大家指出,共同进步!)
9 楼 aone 2007-03-02  
有思想的芦苇 写道
我也来凑个热闹,转贴我的一点想法.
http://junglesong.yculblog.com/post.2664685.html

继承,接口,抽象类的区别是面试官最喜欢问的问题,因为编程中常用,这里不想说那些老生常谈,只想借相声打个比方.

继承好比家学渊源,所谓"忠厚传家久,诗书继世长",家长总会潜移默化的影响下一代,下一代也会在不经意中学习前辈的特点,但因为年少分辨能力不高加上世易时移有些优点已经不再是有点甚至会变成缺点,下一代会把前辈的优缺点不分良莠的继承下来.这也是日后出现问题的根源.

接口好比拜师学艺,"入了这个门,就得说这行话",比如相声界说学逗唱四门是必须要学的,但是"师傅领进门,修行在个人",学得怎么样还全看自己,指望不费力的继承什么是不可能的,具体功夫还得个人来过. 因为是自己来,具体实现成什么样自由度也很大,比如四门功课中的"唱",原指唱太平歌词,但因为爱听的少,现在相声演员已经不要求这个了,改为唱歌唱戏的唱,其实严格界定的话是"学"的一种.这也无所谓对错,郭德刚坚持唱太平歌词也行,笑林唱流行歌曲也不错,总之实现了就可以,实现得怎么样则留给实践来检验.

抽象类则介于继承和接口之间,既可不费力的从上一代继承,也可强制实现某接口,有如某大师收自己的孩子为徒,当然相声界不让这么干,其它曲艺行业还是可以的,比如京剧界的梅兰芳和其子梅葆玖,既有言传身教,也有强制实现,综合了继承和接口的特点.

具体怎么用它们要看实际需要,如果是为了实现继承体系,当然是用继承;如果只是强制子类必须和父类统一口径,自然是用接口;如果子类说统一口径行,但必须给我些东西,那还是用抽象类不可.


解释的真好,
8 楼 retreat 2007-03-02  
Abstract Class更注重的是类的属性 ...

也就是说,他所关注的是这一类东西所关注的东西,或者是需要了解的东西.也就是说,它和extend的类是定义在同一等级上的.

Interface则注重的是类是如何和外界交互的 ...

也就是说,借口关注的是类的行为,借口不需要了解类的东西.只需要反映类对外所表现.它和impl他的类不在一个等级上
7 楼 NightTree 2007-03-02  
downpour 写道
原文在ibm developworks上,说得比你更多。


给个链接阿。。。
6 楼 有思想的芦苇 2007-03-01  
我也来凑个热闹,转贴我的一点想法.

继承,接口,抽象类的区别是面试官最喜欢问的问题,因为编程中常用,这里不想说那些老生常谈,只想借相声打个比方.

继承好比家学渊源,所谓"忠厚传家久,诗书继世长",家长总会潜移默化的影响下一代,下一代也会在不经意中学习前辈的特点,但因为年少分辨能力不高加上世易时移有些优点已经不再是有点甚至会变成缺点,下一代会把前辈的优缺点不分良莠的继承下来.这也是日后出现问题的根源.

接口好比拜师学艺,"入了这个门,就得说这行话",比如相声界说学逗唱四门是必须要学的,但是"师傅领进门,修行在个人",学得怎么样还全看自己,指望不费力的继承什么是不可能的,具体功夫还得个人来过. 因为是自己来,具体实现成什么样自由度也很大,比如四门功课中的"唱",原指唱太平歌词,但因为爱听的少,现在相声演员已经不要求这个了,改为唱歌唱戏的唱,其实严格界定的话是"学"的一种.这也无所谓对错,郭德刚坚持唱太平歌词也行,笑林唱流行歌曲也不错,总之实现了就可以,实现得怎么样则留给实践来检验.

抽象类则介于继承和接口之间,既可不费力的从上一代继承,也可强制实现某接口,有如某大师收自己的孩子为徒,当然相声界不让这么干,其它曲艺行业还是可以的,比如京剧界的梅兰芳和其子梅葆玖,既有言传身教,也有强制实现,综合了继承和接口的特点.

具体怎么用它们要看实际需要,如果是为了实现继承体系,当然是用继承;如果只是强制子类必须和父类统一口径,自然是用接口;如果子类说统一口径行,但必须给我些东西,那还是用抽象类不可.
5 楼 lkyooo 2007-02-24  
其实不能多重继承就会造成代码重复....
4 楼 wangdi 2006-11-01  
呵呵,是说的比我多,因为我没有把原文抄下来,另外不是jackrong的文章,他也是转摘的别人的文章……
3 楼 cwx714 2006-11-01  
写的不错!
2 楼 downpour 2006-11-01  
原文在ibm developworks上,说得比你更多。
1 楼 wangjl_yt 2006-10-31  
解释的很清楚。

相关推荐

    深入理解abstract class和interface

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性...

    abstract class和interface有什么区别?

    ### abstract class和interface有什么区别? 在面向对象编程中,`abstract class` 和 `interface` 都是用来实现抽象化的工具,但它们之间存在着重要的差异。理解这些差异有助于开发者更有效地设计和实现软件系统。 ...

    java中abstractclass和Interface.doc

    - 结合`abstract class`和`interface`的优点,可以通过定义一个`interface`并在其下方定义一个实现该接口的`abstract class`来达到最佳效果。 - 这样既确保了接口的灵活性,又提供了抽象类的部分实现,方便后续的...

    [转]深入理解abstract class和interface

    在编程领域,`abstract class`(抽象类)和`interface`是两种重要的设计模式,它们在构建可扩展和模块化的软件系统中起着至关重要的作用。这篇文章将深入探讨这两个概念,以及它们在实际开发中的应用。 首先,让...

    java abstract class interface之间的区别介绍

    在Java编程语言中,抽象类(abstract class)和接口(interface)都是用于实现抽象化的重要工具,它们可以帮助程序员更好地组织代码,提高代码的可复用性和扩展性。尽管二者在功能上有一些相似之处,但在实际使用中...

    interface&abstract class

    在面向对象编程语言中,如Java,接口(Interface)和抽象类(Abstract Class)是两种非常重要的概念,它们都被用来实现代码的复用性和扩展性。但它们之间存在一些根本性的区别,这些差异对于正确地设计类结构至关...

    Java abstract class 与 interface对比

    在Java编程语言中,`abstract class`(抽象类)和`interface`是两种重要的机制,它们用于实现多态性和抽象性。虽然它们都可以用来定义抽象方法,但它们之间存在显著的差异,这些差异影响了开发者在设计软件时的选择...

    Java抽象类和借口的区别.pdf

    Java抽象类和借口的区别 Java抽象类和借口是Java语言中两种支持抽象类定义的机制,它们在...选择合适的机制需要根据问题领域的特点和设计理念,正确地理解和使用abstract class和interface是软件设计和开发的关键。

    Struct 、Class、Interface、Abstract区别与关系

    Struct 、Class、Interface、Abstract各个的特性、应用场景等对比

    Java中抽象类和接口的区别.zip_java interf

    在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...

    Java中抽象类和接口的区别

    在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...

    class.forname的作用 详细解析抽象类和接口的区别

    从编程的角度来看,abstract class 和 interface 都可以用来实现 "design by contract" 的思想。但是在具体的使用上面还是有一些区别的。首先,abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用...

    Java程序开发中abstract 和 interface的区别详解

    在Java编程语言中,`abstract class`(抽象类)和`interface`都是用来定义抽象类的概念,它们在面向对象设计中扮演着重要的角色。抽象类主要用于表示一系列具有共同特征但又各自具有独特行为的具体类的抽象,而接口...

    static、final、abstract和interface使用总结

    在Java编程语言中,`static`、`final`、`abstract`和`interface`是四个非常重要的关键字,它们分别代表不同的特性,用于定义类、变量和方法的行为。下面是对这些关键字的详细解释: 1. **static(静态)** - **...

    abstract class

    abstract class 抽象类--不具体的类 1) 抽象方法,只有行为的概念,没有具体的行为实现。 2) 包含抽象方法的类,就一定是抽象类。 使用: abstract 关键字修饰,包含抽象方法。 如:平面图形一定可以计算面积。 ...

    Abstract Class Polymorphism_C#_

    在C#编程语言中,抽象类(Abstract Class)和多态性(Polymorphism)是面向对象编程的核心概念。这两个概念对于任何C#初学者来说都至关重要,因为它们能够帮助开发者构建灵活、可扩展和易于维护的代码。 首先,我们...

    Python3之接口类(InterfaceClass)浅谈

    在Python编程语言中,接口类(Interface Class)是一种设计模式,用于定义子类必须遵循的规范,确保子类具有特定的公共方法。Python不同于某些面向对象的语言(如Java),它并没有内置的接口概念,但可以通过使用`...

Global site tag (gtag.js) - Google Analytics