Java核心技术——对象与类

对象与类

面向对象程序设计概述

  • 面向对象程序设计(简称 OOP) 是当今主流的程序设计范型, 它已经取代了 20 世纪 70年代的“ 结构化” 过程化程序设计开发技术。Java 是完全面向对象的, 必须熟悉 OOP 才能够编写 Java 程序。
  • 面向对象的程序是由对象组成的, 每个对象包含对用户公开的特定功能部分和隐藏的实现部分。程序中的很多对象来自标准库,还有一些是自定义的。究竟是自己构造对象, 还是从外界购买对象完全取决于开发项目的预算和时间。但是, 从根本上说, 只要对象能够满足要求,就不必关心其功能的具体实现过程。在 OOP 中, 不必关心对象的具体实现,只要能够满足用户的需求即可。
  • 传统的结构化程序设计通过设计一系列的过程(即算法)来求解问题。一旦确定了这些过程, 就要开始考虑存储数据的方式。正如Pascal语言的设计者表述的那样,算法+数据结构=程序(Algorithm + Data Structures = Programs),即算法是第一位的,数据结构是第二位的。首先要确定如何操作数据,然后再决定如何组织数据,以便于数据操作。而OOP中,将数据放在第一位然后再考虑操作数据的算法。
  • 面向对象开发更加适合于解决规模较大的问题
    面向对象与面向过程的程序对比
    • 类(class)是构造对象的模板或蓝图,由类构造(construct)对象的过程称为类的实例(instance)
    • 封装( encapsulation , 也称数据隐藏),从形式上看,封装是将数据和行为组合在一个包中, 并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域( instance field ), 操纵数据的过程称为方法( method )。 对于每个特定的类实例(对象)都有一组特定的实例域值。这些值的集合就是这个对象的当前状态( state )。无论何时,只要向对象发送一个消息,它的状态就有可能发生改变。
    • 封装是为了不让类的方法直接访问其他类的实例域,程序之间仅通过对象方法与数据对象进行交互,这样就使对象具有了黑盒的特征,从而提高了重用性和可靠性。这样使一个雷改变存储数据的方式后,不会对其他类造成影响。
    • OOP使用户自定义Java类变得容易,可以通过扩展一个类来建立另外一个类,在扩展一个已有类时,这个扩展后的新类具有所扩展的类的全部的属性和方法,只需要在新类中提供所需的新方法和新数据域即可,通过扩展一个类来建立另一个新类的过程称为继承(inheritance)
  1. 对象
    • 对象的三个特征
      • 对象的行为(behavior)——可以对对象施加那些操作,或者可以对对象施加那些方法?
      • 对象的状态(state)——当施加那些方法时,对象如何响应?
      • 对象标识(identity)——如何分辨具有相同行为与状态的不同对象?
    • 同一个类的所有对象实例, 由于支持相同的行为而具有家族式的相似性。对象的行为是用可调用的方法定义的。
    • 对象的状态保存着描述当前特征的信息,对象的状态可能会随时间而发生改变,但不能自发地产生改变,必须通过调用方法实现,如果不经方法调用就改变了对象的状态,就破坏了对象的封装。
    • 每个对象都有唯一的身份(identity),对象的状态并不能完全描述一个对象,作为一个类的实例, 每个对象的标识永远是不同的,状态常常也存在着差异。
    • 对象的这些关键特性在彼此之间相互影响着。例如, 对象的状态影响它的行为。
  2. 识别类
    • 传统的过程化程序设计, 必须从顶部的 main 函数开始编写程序。在面向对象程序设计时没有所谓的“ 顶部”。在OOP 设计时,首先从设计类开始,然后再往每个类中添加方法。识别类的简单规则是在分析问题的过程中寻找名词,而方法对应着动词。
  3. 类之间的关系
    • 在类之间最常见的关系有
      • 依赖(uses-a)
      • 聚合(has-a)
      • 继承(is-a)
    • 依赖( dependence ), 即“ uses-a” 关系, 是一种最明显的、 最常见的关系。例如,Order类使用 Account 类是因为 Order 对象需要访问Account 对象查看信用状态。但是 Item 类不依赖于 Account 类, 这是因为 Item 对象与客户账户无关。因此, 如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。
    • 应该尽可能地将相互依赖的类减至最少。如果类 A 不知道 B 的存在, 它就不会关心 B的任何改变(这意味着 B 的改变不会导致 A 产生任何 bug)。用软件工程的术语来说,就是让类之间的耦合度最小。
    • 聚合(aggregation),即“has-a”关系,是一种具体且易于理解的关系。例如,一个Order对象包含一些Item对象。聚合关系意味着类A的对象包含类B的对象。
    • 继承( inheritance ), 即“ is-a” 关系, 是一种用于表示特殊与一般关系的。一般而言, 如果类 A 扩展类 B, 类 A 不但包含从类 B 继承的方法,还会拥有一些额外的功能。例如,RushOrder类由 Order 类继承而来。在具有特殊性的RushOrder 类中包含了一些用于优先处理的特殊方法, 以及一个计算运费的不同方法;而其他的方法, 如添加商品、 生成账单等都是从Order 类继承来的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值