`

OO的基本概念---------多态性

阅读更多

OO五大原则:

SRPOCPLSPDIPISP

SRPSingle Responsibility Principle 单一职责原则)

对象的功能应该单一

 

OCPOpen Close Principle 开闭原则)

对修改关闭,对扩展打开

 

LSPLiskov Substitution Principle 里氏替换原则)

“老鼠的儿子会打洞”,子类应该具备父类的特征。

 

DIPDependence Inversion Principle 反向依赖原则)

不应该依赖“客户”的东西,后端提供方法不应该依赖前端对象。

 

ISPInterface Segregation Principle 接口分隔原则)

尽量提供有针对性符合功能特点的简单接口,而不是包含很多方法的大而总接口。

 

多态性(polymorphism)是面向对象编程的属性,它允许多个方法使用同一个接口。Java从多个方面支持多态性,其中两个方面最为突出。第一个是每个方法(标记为 final的方法除外)都可以被子类重写;第二个是设立interface关键字。

超类中的方法可以在派生类中重写,在类的层次结构中,每个子类都将它的超类特化(sepcialization)。超类的一个引用可以引用它的任何一个子类,而且通过超类的引用调用某子类对象的一个方法时,会自动执行由该子类重写后的版本。因此,可以用超类来定义对象的形式并提供对象的默认实现,而子类根据这种默认实现进行修改,以更好地适应具体情况的要求。因此,在超类中定义的一个接口可以作为多个不同实现的基础。

Java进一步采取了“一个接口,多个方法”的概念。它定义了interface关键字,这样就可以将类的方法和类的实现完全分离。尽管接口是抽象的,但是仍然可以声明接口类型的引用。这个概念非常重要,因为它可以改进多态性的应用。只要某个类实现一个接口,并且该接口提供了某种功能,那么任何需要这种功能的代码都可以使用这个类的对象。例如,假设某个接口的名称为myMethod,考虑下面的方法:

 

  void myMethod(MyClass ob) { //....}

 

  任何实现了MyClass 接口的对象都可以传递给myMethod()方法。该对象的其他功能无需考虑。myMethod()方法可以对任何实现了MyClass 接口的对象进行操作

 

解析抽象类和接口的区别

Abstract classinterface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换.但两者存在很大的区别:

抽象类:在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的,

在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类

 

从语法定义层面看abstract classinterface 

abstract class方式中,它可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,它只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class           

 

从编程的角度来看

首先,abstract classJava语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface

其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。

 

从设计理念层面看abstract classinterface

Abstract classinterface所反映出的设计理念,来分析一下二者的区别。

前面已经提到过,abstarct classJava语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的

 

对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。

 

分享到:
评论

相关推荐

    js-oo-mvc-app:JS的基本MVC-与Dan Lewis学习

    在JavaScript中,我们可以通过构造函数创建类,使用原型链实现继承,以及利用封装和多态性来提高代码复用和模块化。例如: 1. **构造函数**:`function Person(name) { this.name = name; }` 创建了一个名为Person...

    oo-trabalho-rpg

    多态性允许使用父类引用处理子类对象,增加代码的灵活性。 3. **接口**:在Java中,接口(Interface)用于定义行为规范。在RPG游戏中,可能存在一个名为`Interactive`的接口,被角色、敌人和其他可交互的对象实现,...

    2013-oo-programming-part2:赫尔辛基大学MOOC的第2部分

    1. 类与对象:如何定义类,创建对象,以及类的封装、继承和多态性。 2. 构造器:用于初始化新创建的对象。 3. 访问控制:了解public、private、protected和默认的访问修饰符。 4. 继承:子类继承父类的属性和方法,...

    《信息系统建模与uml》-4

    - **C++**:C++支持多重继承、抽象类、多态性等特点,提供了强大的内存管理和控制能力。 - **DataType**:支持原始数据类型、对象引用、数组等。 - **Class**:定义了类的结构和行为。 - **Inheritance**:支持单...

    OO Bench-开源

    OOP 的核心概念包括类、对象、继承、封装和多态性。OO Bench 通过一系列基准测试,评估不同语言在实现这些概念时的效率。 **OO Bench 测试内容** OO Bench 的测试涵盖以下几个关键领域: 1. **对象创建与初始化**...

    4sem-ooop-lab1

    4. **多态**:多态性允许不同类的对象对同一消息作出不同的响应。C++通过虚函数和抽象类实现多态。 5. **构造函数与析构函数**:构造函数用于初始化新创建的对象,而析构函数则在对象销毁前执行清理工作。在C++中,...

    SAP BC404_EN46C_FV ABAP Object Object-oriented R3.pdf

    - **提高灵活性**:多态性允许以统一的接口调用不同的实现,提高了系统的灵活性和可扩展性。 ### 三、SAP BC404课程内容概览 BC404课程是SAP官方提供的标准培训之一,专门讲解如何在SAP R/3系统中使用ABAP Objects...

    object-oriented-javascript

    面向对象编程的核心概念包括封装、继承和多态性。虽然 JavaScript 作为一种原型式语言,并不原生支持类的概念,但它提供了其他机制来实现面向对象编程的基本原则。 - **封装**:封装是指隐藏对象的内部状态和实现...

    学习Java的30个基本概念

    12. Java的OO特性:Java的OO特性包括封装、继承和多态性等。 13. Java的安全特性:Java的安全特性包括防病毒和防攻击的System等。 14. Java的中立体系结构:Java的中立体系结构使得Java编译器生成的目标文件格式...

    Pokemon-OO-Replationships

    例如,所有的宠物小精灵都可以进行战斗,但是每个宠物小精灵的攻击方式可能会不同,这就体现了多态性。 在Ruby中,我们还可以利用模块(Module)来实现代码复用和分类。例如,我们可以定义一个`ElectricType`模块,...

    2004-2005 答案1

    3. 阐述了类的封装(信息隐藏)、继承和多态性在面向对象编程中的核心作用。封装提供数据访问控制,降低系统耦合度;继承允许快速传播变更;多态性则减少了扩展系统的成本。 **Part IV** 的开放性问题鼓励学生提供...

    java 面向对象的程序设计讲义

    - 多态性的定义及其重要性。 - 动态绑定的机制及其实现原理。 - **抽象类与抽象方法**: - 抽象类的定义与使用场景。 - 抽象方法的特点及其在继承体系中的作用。 ##### 第九周至第十周 - **递归编程**: - 递归...

    OO面向对象测试代码

    6. **多态**:C语言中,多态性可以通过函数指针和回调函数来实现。每个对象可以有指向处理其特定行为的函数的指针,从而达到多态的效果。 7. **模拟类与实例**:通过定义一个结构体表示类,并提供一组初始化和操作...

    北航OO课作业代码

    3. **多态**:多态性是指同一种行为可以有不同的表现形式。在Java中,通过接口(Interface)和抽象类(Abstract Class)可以实现多态。例如,可以定义一个`Transport`接口,包含`startJourney()`和`endJourney()`...

    物件導向程式設計講義-Java

    OOP的主要特性包括封装、继承、多态性,这些特性旨在提高代码的可读性、可维护性和可扩展性。 #### Java作为物件导向语言 Java是一种广泛使用的物件导向程式设计语言,由Sun Microsystems开发,并由Oracle公司维护...

    estudos-java-oo

    4. 多态:了解多态性允许不同的对象对同一消息作出不同的响应,这是通过接口、抽象类和方法覆盖实现的。 5. 接口:接口定义了一组方法的签名,但不包含方法的实现,是实现多态的一种方式。 6. 构造器与析构器:构造...

    实战SAP程序开发-从实例学ABAP编程.rar

    9. ABAP Objects(OO-ABAP):引入了面向对象的概念,包括类、继承、封装和多态性。 通过阅读《实战SAP程序开发-从实例学ABAP编程》这本书,你可以逐步掌握这些知识点,并通过实例练习提升自己的ABAP编程能力,从而...

    java-examples:具有小型Java程序的存储库以应用OO概念

    5. **多态性(Polymorphism)**:多态性允许一个接口有多种不同的实现,或者一个对象可以表现出多种形态。Java通过方法重载(overloading)和方法重写(overriding)实现了多态性。 6. **抽象(Abstraction)**:...

    TAW10 ABAP Certification Test Part 2.pdf

    - **定义**: 多态性允许不同的对象类型以相同的方式处理消息。 - **示例**: 使用超类引用来调用子类的方法。 #### 24. 类方法的实现位置 - **概念**: 类方法的实际实现代码。 - **位置**: 在类定义的`DEFINITIONS`...

    polymorphism in c++

    ### C++中的多态性详解 #### 知识点概览 - **多态性**在面向对象编程中是一项核心特性,它允许我们通过基类的指针或引用调用派生类的方法。 - **侯捷 C++ 多态**这一主题主要探讨了如何在C++中实现和应用多态,尤其...

Global site tag (gtag.js) - Google Analytics