面向对象程序设计概述

简介: 面向对象程序设计概述

     面向对象程序设计(Object-Oriented Programming,OOP)是当今的主流程序设计范型,它取代了20世纪70年代的“结构化”或过程式编程技术。由于Java是面向对象的,所以必须熟悉OOP才能够很好地使用Java。


       面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能和隐藏的实现。程序中的很多对象是来自标准类库的“成品”,还有一些是自定义的。究竟是自己构造对象,还是从外界购买,这完全取决于开发项目的预算和时间。但是,从根本上说,只要对象能够满足要求,就不必关心其功能到底是如何实现的。


一、类


       类(class)指定了如何构造对象。可以将类想象成制作小甜品的模具,将对象想象为小甜饼。由一个类构造(construct)对象的过程称为这个类的实例(instance)。


       标准Java库中提供了几千个类,可用于各种目的,如用户界面设计、日期和日历,以及网络编程。还有自行创建的类,来描述需求应哟相应问题领域中的对象。


       封装(encapsulation,有时称为信息隐藏)是处理对象的一个重要概念。从字面意思看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现细节。


       实现封装的关键在于,绝不能让其他类中的方法直接访问这个类的实例字段。程序只能通过对象的方法与对象数据进行交互。封装为对象赋予了"黑盒"特性,这有利于提高重用性和可靠性。


       OOP的另一个原则会让用户自定义Java类变得更为容易,就是可以通过扩展其他类来构建新类。Java提供类一个“超类”,名为Object,所有其他类都扩展至Object


       扩展一个已有的类时,这个新类具有被扩展的那个类的全部属性和方法,只需要在新类中提供适用于这个新类的新方法和实例字段。通过扩展一个类来得到另外一个类的概念称之为继承(inheritance)。


二、对象


使用OOP,一定要清楚对象的三个主要特性:


● 对象的行为(behavior)—— 可以对这个对象做哪些操作,或者可以对这个对象应用哪些方法?


● 对象的状态(state)—— 调用那些方法时,对象会如何响应?


● 对象的标识(identity)—— 如何区分可能有相同行为和状态的不同对象?


       同一个类的所有示例对象都有一种家族相似性,它们都支持相同的行为。一个对象的行为由所调用的方法来定义。


       每个对象都会保存着描述当前状态的信息,这就是对象的状态。对象状态的改变必然是调用方法的结果(如果不经过方法的调用就可以改变对象状态,这说明破坏了封装性)。


       对象的状态并不能完全描述一个对象,因为每个对象都有一个唯一的标识(identity,或称身份)。需要注意,作为同一个类的实例,每个对象的标识总是不同的,状态通常有所不同。


       对象的这个关键特性会彼此相互影响。例如,对象的状态会影响它的行为(如果一各订单"已发货"或"已付款",就应该拒绝要求增删商品的方法调用。反过来,如果订单是“空的”,即还没有订购任何商品,就不应该允许"发货")。


三、识别类


       传统的过程式程序中,必须从最上面的main函数开始编写程序。设计一个面向对象系统时,则没有所谓的“最上面”。因此,学习OOP的初学者常常会感觉无从下手。答案是:先从识别类开始,然后再为各个类添加方法。


       识别类的一个简单经验是在分析问题的过程中寻找名词,而方法对应动词。


       例如,在订单处理系统中,有这样一些名词:


● 商品(Item);


● 订单(Order);


● 发货地址(Shipping address);


● 付款(Payment);


● 账户(Account)。


从这些名词就可以得到类Item、Order等。


       接下来查找动词。商品要添加(add)到订单中,订单可以发货(ship)或取消(cancel),另外可以对订单完成付款(apply)。对于每一个动词,如“添加”“发货”“取消”或者“完成付款”,要识别出负责完成相应动作的对象。例如,当一个新商品添加到订单中时,订单对象就是负责的对象,因为它知道如何存储商品以及如何对商品进行排序,也就是说,add应该是Order类的一个方法,它接收一个Item对象作为参数。


四、类之间的关系


类之间最常见的关系有


● 依赖(“uses-a”);


● 聚合(“has-a”);


● 继承(“is-a”)。


       依赖(dependence),即“uses-a”关系,是一种最明显的也最一般的关系。例如,Order类使用了Account类,因为Order对象需要访问Account对象来查看信用状态。但是Item类不依赖于Account类,因为Item对象不需要考虑客户账户。因此,如果一个类的方法要使用或操作另一个类的对象,我们就说前一个类依赖于后一个类。


       应当尽可能减少相互依赖的类。这里的关键是,如果类A不知道B的存在,它就不会关心B的任何改变(这意味着B的改变不会在A中引入bug)。用软件工程的术语来说,就是要尽可能减少类之间的耦合(coupling)。


       聚合(aggregation),即“has-a”关系,很容易理解,因为这种关系很具体。例如,一个Order对象包含一些Item对象。包含关系意味着类A的对象包含类B的对象。


       继承(inheritance),即“is-a”关系,表示一个更特殊的类与一个更一般的类之间的关系。例如,Rushorder类继承了Order类。在特殊化的RushOrder类中包含一些用于优先处理的特殊方法,还提供了一个计算运费的不同方法;而其他的方法,如添加商品、生成账单等都是从Order类继承来的。一般而言,如果类D扩展了类C,类D会继承类C的方法,另外还会有一些额外的功能。


目录
相关文章
|
6月前
|
Java 物联网 测试技术
Java面向对象程序设计3面向对象基础
Java面向对象程序设计3面向对象基础
329 0
|
C++
20 C++ - 面向对象程序设计案例
20 C++ - 面向对象程序设计案例
84 0
|
6月前
|
存储 人工智能 运维
面向对象基础
面向对象基础
66 0
面向对象基础
面向对象程序设计(OOP)的基本概念
面向对象程序设计(OOP)的基本概念
190 0
|
存储
面向对象程序设计第四章
面向对象程序设计第四章
128 1
面向对象程序设计第四章
|
程序员 测试技术 C语言
c++面向对象程序设计入门
c++面向对象程序设计入门
157 0
|
编译器 C++
c++面向对象程序设计教程——类(一)
c++面向对象程序设计教程——类(一)
169 0
|
C++
c++面向对象程序设计教程——类(二)
c++面向对象程序设计教程——类(二)
118 0
面向对象程序设计-第一章:面向对象程序设计基础
面向对象程序设计-第一章:面向对象程序设计基础
180 0
面向对象程序设计-第一章:面向对象程序设计基础
面向对象程序设计-第二章
面向对象程序设计-第二章
50 0
面向对象程序设计-第二章