`

理解java中的抽象类与接口

    博客分类:
  • java
阅读更多
抽象方法:仅有声明没有方法体
abstract void f();

抽象类:包含抽象方法的类
抽象类可以不含有抽象方法,但是含有抽象方法的类必须声明为抽象类。
一个类如果继承了抽象类,但是并没有实现所有的抽象方法,那么它还是一个抽象类。
抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
抽象类和普通类的主要有三点区别:
  1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
  2)抽象类不能用来创建对象;
  3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。


接口(interface)
完全抽象的类,不含有任何具体实现,接口中的域默认都是static和final的,方法默认也是public。
在接口中的域,不能是空final的,所以必须要初始化,但是可以使用非常亮表达式来初始化,例如
public interface RandVals {
Random RAND = new Random(47);
int RANDOM_INT = RAND.nextInt(10);
}
一个接口表示:所有实现了该特定接口的类看起来都像这样。接口一般用于建立类与类之间的协议。
implements关键字用来实现接口。
在实现多个接口时,当多个接口中存在同名方法时,通常会造成代码的混乱,所以尽量避免这种情况。(当确实存在这种情况时,可以让类实现一个接口,再类内部创建一个内部类实现另外的接口)
接口与类的区别:
1)接口不能用于实例化对象。
2)接口没有构造方法。
3)接口中所有的方法必须是抽象方法。
4)接口不能包含成员变量,除了static和final变量。
5)接口不是被类继承了,而是要被类实现。
6)接口支持多重继承。

接口与抽象类的区别
1.语法层面上的区别:
  1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.设计层面上的区别
  1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。
  2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

 下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:
abstract class Door {
    public abstract void open();
    public abstract void close();
}
  或者:
interface Door {
    public abstract void open();
    public abstract void close();
}

但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:
  1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
  2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。
  从这里可以看出,Door的open()、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

参考资料:
1、java编程思想
2、http://www.cnblogs.com/dolphin0520/p/3811437.html
分享到:
评论

相关推荐

    Java中抽象类和接口的区别

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

    详细解析Java中抽象类和接口的区别

    ### 详细解析Java中抽象类和接口的区别 #### 引言 在面向对象编程中,Java作为一种广泛应用的编程语言,提供了多种方式来实现抽象的概念。其中最常用的两种机制是抽象类(abstract class)和接口(interface)。这...

    java 抽象类与接口的练习

    接口与抽象类的选择取决于具体的设计需求。如果关注的是行为的规范,且可能有多个实现者,那么接口是更好的选择。如果需要共享实现细节或者提供默认行为,抽象类则更为合适。 在压缩包中的"抽象类与接口"文件中,你...

    java抽象类与接口区别

    本文将深入探讨Java抽象类与接口的区别,帮助初学者更深刻地理解这两个概念。 #### 二、理解抽象类与接口的基本概念 ##### 抽象类 - **定义**:抽象类是一种特殊的类,它不能被实例化。抽象类通常包含一个或多个...

    JAVA中抽象类与接口的区别

    在Java编程语言中,抽象类(Abstract Class)与接口(Interface)是实现抽象与多态性的两种关键机制。这两种机制的出现,极大地丰富了Java语言的面向对象特性,并为开发者提供了更为灵活的设计选择。下面将从多个...

    java中的抽象类和接口的理解

    ### Java中的抽象类和接口的理解 #### 一、引言 在面向对象编程语言Java中,抽象类(Abstract Class)和接口(Interface)是实现多态性和代码复用的重要手段。它们都允许开发者定义行为规范而不需要具体实现细节,...

    java 抽象类与接口的区别

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们都用于实现多态性,但各自具有不同的特点和应用场景。了解并熟练掌握它们的区别对于编写高质量的Java代码至关重要。 首先,抽象类是一种不能被...

    java中接口与抽象类的详细分析与比较

    在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性的关键...通过阅读"java中接口与抽象类的详细分析与比较.doc"文档,你将获得更深入的洞察和实践指导,进一步提升你的Java编程能力。

    Java中抽象类和接口的区别与作用详解

    ### Java中抽象类和接口的区别与作用详解 #### 一、引言 在Java编程语言中,`abstract class`和`interface`是两种用于定义抽象类的重要机制。这两种机制不仅支持了Java的强大面向对象特性,而且也在实际开发过程中...

    Java源代码:抽象类和接口

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们允许我们定义规范,为其他类提供模板或行为指南。让我们深入探讨这两个概念及其在Java中的应用。 首先,我们来理解抽象类。在Java中,抽象类是一...

    Java抽象类接口与多态PPT教案学习.pptx

    Java抽象类接口与多态是Java编程语言的核心概念,本篇资源文件将详细介绍Java中的抽象类、接口和多态的概念、特点和应用。 一、抽象类 抽象类是Java中的一种特殊的类,它不能被实例化,仅供子类继承使用。抽象类的...

    JAVA:抽象类和接口

    **抽象类**与**接口**作为Java语言中实现抽象的两种主要手段,在面向对象编程中扮演着至关重要的角色。它们各自具有独特的特性和用途,使得开发人员可以根据具体的需求灵活地选择合适的方式来组织代码结构。 **抽象...

    Java抽象类和接口相关操作源码.rar

    在这个“Java抽象类和接口相关操作源码”压缩包中,你可能会找到一系列的实例代码,帮助初学者更好地理解和运用这两种特性。 **抽象类(Abstract Class)** 抽象类在Java中是一种不能被实例化的类,它主要用于被...

    Java中抽象类和接口的使用研究.pdf

    理解抽象类和接口的区别并合理地在设计中使用它们,可以提高Java程序的灵活性、可维护性和可扩展性。在实际编程中,根据需求和设计原则灵活运用抽象类和接口,可以构建更加高效和健壮的软件系统。

    java利用接口和抽象类改写求圆的面积和梯形的面积.docx

    #### 深入理解Java的接口和抽象类 在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性和代码复用的重要概念。它们都无法被直接实例化,而是位于继承结构的顶层,被其他类实现或继承...

    Java语言中抽象类和接口的应用探究.pdf

    Java语言中抽象类和接口的应用探究是非常重要的,因为它们之间的选择反映出对于需求本质的合理理解和设计意图的正确理解。只有正确地选择抽象类还是接口,才能设计出更加高效、强大的Java程序。 在本文中,我们将对...

    \\java类、抽象类、接口、继承和对象解析 .doc

    5. **接口与抽象类的关系** - 抽象类可以包含非抽象方法的实现,而接口则只能定义方法签名,不能有实现。 - 类可以继承一个抽象类,并实现多个接口。这意味着抽象类和接口提供了不同的多态性形式。 - 当需要一组...

    java 抽象类及接口

    在Java编程语言中,抽象类和接口是面向对象设计的重要组成部分,它们允许程序员定义通用的类型和行为,以便在各种具体实现中复用和扩展。下面我们将深入探讨这两个概念。 首先,抽象类是一种特殊的类,它使用`...

    Java抽象类和接口 Java全栈

    总结来说,Java抽象类和接口是面向对象设计的重要工具,它们有助于代码的复用、模块化和扩展性。在Java全栈开发中,灵活运用抽象类和接口可以提高代码质量,降低维护成本,提升系统灵活性。开发者需要根据具体需求来...

Global site tag (gtag.js) - Google Analytics