面向对象编程的基本概述

一、面向对象的基本概念
1.1 对象
一个对象由两部分组成:属性和行为,对象的基本定义即是包含了数据和行为的实体。数据表现为属性,行为表现为方法。
存放在对象中的数据代表了该对象的状态,在面向对象的术语中,数据被称为属性,而对象的行为表示对象可以做什么。
生活中处处充满了对象,每一个实体即是一个对象,例如人类或者动物都具有五官这些属性,同时还有一些个人的行为动作,吃喝拉撒等行为。
1.2 数据隐藏
限制访问具体的属性和(或)方法的行为叫做数据隐藏,通常,对象不应当操作其他对象的内部数据,因此在面向对象的开发中往往采用取值方法(getter())和赋值方法(setter())。
数据的隐藏其实真是封装的体现,一个对象不应该你直接的去操作另一个对象的数据,通过数据的隐藏并提供取值方法和赋值方法体间接的提供可以很好的做一些数据的控制,这真是面向对象编程的体现。
1.3 类
简单来说类即是对象的蓝图,可以认为类是对象的模板或者模具。类定义了使用该类创建的所有对象具有的属性和行为,对象从类中创建,所以类必须定义对象的基础材料,总是在创建对象之前必须先设计一个类,类是对象的依附体。
类的数据通过属性来表示,类的行为通过方法来定义,在任何情况下,对对象中的属性的访问应该有对象自身控制,任何一个对象都不应该直接修改其他对象的属性。
1.4 封装
面向对象编程即是使用对象提供的行为达到一定的目的,使用对象的一个显著好处是对象无需暴露它的所有属性和行为,仅暴露必要的接口和其他对象进行交互,除了如何使用该对象,其他细节都应当对其他对象隐藏起来,这便是封装的目的。
封装是基于对象即包含属性也包含行为这一事。数据隐藏式封装的主要部分。为了实现数据隐藏,必须将所有的属性声明为private,属性绝不是类接口(类公共方法)的一部分,只有public方法是类对外提供的行为,将属性描述为public破坏了数据隐藏这一概念。
封装的最高指导原则是“所有字段都应该是私有的”。
1.41 接口
尽可能提供最小化的用户接口,当设计类时,通用规则是尽量不要让用户知道类的内部工作原理,为了达到这点,因尽量遵循以下简单的原则:
①只提供用户绝对需要的东西。实际上,这意味着类的接口要尽可能少。当你开始设计一个类时,先从最小化的接口开始。类的设计的迭代式的,所以随后即是你发现最小化的接口可能不合适,再去开放出来也不迟。
②公共接口定义了用户可以访问什么。
③从用户角度定义至关重要,而不是从信息系统的角度定义类。
④确保设计类时你向真正的用户了解了需求和设计,这些人并不局限于开发人员。
1.5 继承
面向对象最强大的功能就是代码重用,通过组织和识别不同类之间的共性,不仅可以实现代码重用,也可以知道设计,继承是实现该功能的主要手段,继承允许一个类继承另一个类的属性和方法,可以通过抽象公共属性和行为来创建新类。
1.51 抽象
面向对象编程的主要优势之一是可以重用类。通常可以重用的类比具体的类的接口更加抽象。具体的接口可以是非常明确的,而抽象接口则更通用。简单来说,高层次的抽象接口比高度具体的接口更有用,大部分情况下如此,当然并非适用所有情况。
接口是行为继承的一种机制,抽象类则用于实现继承,即接口是行为的规范,抽象是对事物共性的抽象。
1.52 is-a 关系
继承往往是is-a关系,is-a即可以表述为子类是一个父类,例如父类Shape(形状)与子类Circle(圆形)、Square(矩形),可以说圆形是一个形状,矩形是一个形状,子类都继承于父类。
1.6 多态
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用),重载方法即是实现多态的手段。
1.61 多态存在的三个必要条件
① 继承
② 重写
③ 父类引用指向子类对象
简单叙述多态的关系:多态必须是是父类跟子类之间的关系,即多态必须是存在继承关系的,继承相同父类的众多子类可以重写父类的方法行为,重新定义子类自己的行为,由于子类是继承自父类的,应该可以用父类对不同子类进行不同的实例化,从而做到引用父类的行为却得到不同子类行为的应答(父类 a = new 子类(),a.行为()),这种向上转型的结果即是父类只能得到子类继承自父类的所有属性和行为,但得不到子类自己独有的属性和行为,多态的实现可以通过接口与继承实现。
1.7 组合
使用其他对象来构建或结合成新的对象,这种方式就是组合。
和继承一样,组合也是一种构建对象的机制,使用其他类构建新类的只有两种方式,即继承和组合。
继承的关系是is-a的关系,而组合则是has-a的关系,例如电视机有(has-a)开关和显示屏,电视显而易见不是一个开关,所以两个没有继承关系,彼此之间是组合的关系,即开关、显示屏、电板等对象组合成了电视,这便是组合。

1.8 小结
面向对象编程,其编程思想在于对象,首先要明白何为对象,对象由什么构成,知道了何为对象之后再来好好思考如何去面向它,面向它(对象)主要通过面向对象的四大特征(手段):封装、继承、多态、组合。每个特征又是相互联系的,封装是为了数据的安全性和隐秘性,继承是为了更好的实现多态,组合即是运用封装、继承、多态这些手段来实现一个更为复杂的对象,从而更加符合现实世界的需求。同时需要明白接口是行为的规范,抽象则是对事物的抽象。

二、面向对象的编程思想
2.1 类设计指导
在设计类时最重要的问题是保持公共接口最小化,提供最小化的公共接口可以保证类尽可能简单。在设计接口最小化中,应尽量做到隐藏实现,识别类的公共接口与类的用户相关,而具体实现则与用户无关,具体实现必须提供用户需要的服务,但这些服务是如何实现的对用户来说是不可见的,改变类的实现不应该影响到用户,这才是设计良好的类。
设计类的过程强迫组织代码为很多可管理的块,把代码分块比大块代码更具维护性。促进可维护性的最好方式之一是减少代码依赖,即修改一个类中的代码不会影响(或使影响最小化)其他类。
2.11 设计健壮的构造函数(以及析构函数)
首先且最重要的一点是,构造函数应该把对象设置为安全的初始状态。这包括了属性初始化以及内存管理等问题,也需要确保在默认的条件下能正确的构造对象,通常提供一个构造函数来处理默认情况是个好的习惯。

2.2 继承与组合的思考
继承正如其名字所示,继承其他类的属性和行为,这是一种父子关系,子类继承父类。组合,即使用其他对象来构建新对象。继承和组合在面向对象(OO)系统中扮演者重要的角色,事实上,最困难及最有趣的设计决策就是决定使用继承还是组合。
2.21 重用对象
继承和组合的主要目的大概就是对象重用,通过继承和组合来利用其他类就可以构建新的类(最终变为对象),实际上这是重用以前构建好的类的唯一方式。
继承代表了is-a 关系,比如狗是哺乳动物。
组合则是使用其他类来构建出更复杂的类,即其是一个装配集合。这种情况下没有父子关系,基本上复杂的对象都是由其他对象组合而成。组合代表了has-a关系。
2.22 继承
在一个狗(Dog)类中,很简单的我们能找出一系列的各种狗的品种,如下图的一个Dog类的继承体系图:

图 1
在此体系中,从上到下是从通用到具体的过程,越往上越通用,共同性越高,越往下越具体,特例性越高。该概念有时被称为通用到特例,这是使用继承时的有一个重要的考虑因素。即在继承树中越往下,事情变得越特殊,最通用的事情位于树的顶端。继承就是根据通用因素从通用到具体的过程。
理论上来说,找到越多的共同点越好。然而有时过于精确也会存在设计问题。尽管找出尽可能多的共同点更加靠近真实生活,然而并不表示跟靠近模型。找出的点越多,系统会越复杂,这便会陷入一个难题,到底想要更加精确的模型还是复杂度低的系统,这便需要根据情况进行决策。
决定在设计时引入更小的复杂度或者更多的功能是一项平衡的艺术,其创建一个系统是保持一定的弹性,引入复杂度是不至于被自身压垮。
2.23 组合
组合技术通常用于想在新类中使用现有类的功能而非要特殊化某个类的情况,继承则体现在想要特殊化某个现有的对象,即在继承树中,越往下对象只能是越特殊化,因此能用组合解决的先用组合,再考虑用继承。组合并没有继承,是以别的对象作为自身的属性。一个特定的对象由其他对象组合而成,而且这些对象被作为对象属性,那么这个新的对象被称为混合或者聚合、综合对象。
2.3 封装
封装是面向对象的本质概念,在谈接口/实现范式时其实都在谈封装,根本问题是对于一个类而言,它应该暴露什么信息,不暴露什么信息。封装等同于数据和行为。
封装和继承是什么关系?封装是面向对象的本质,所以它面向对象设计的基本原则之一。继承也是三个主要的面向对象概念之一,然而,继承在某种程度上破坏了封装。在类的体系结构中继承弱化了封装,继承意味着对其他类的强封装,但是弱化了父类和其子类之间的封装。同时多态也是对继承最优雅的使用之一。
2.4 抽象类与接口
抽象类继承子对象的行为,也可以是规范子对象行为,对行为的一种抽象,接口是完全的规范对象的行为。在Java中,类继承抽象类,而实现接口。
有时继承被称为实现继承,而接口被称为定义继承。接口是继承的特殊类型,继承是严格的is-a关系,但接口不是。接口可以被应用的不相关的类,而抽象类即对相似事物特征的抽象,抽象类可以体统一些实现,而接口只模型化行为,接口永远不会提供任何类型的实现,只有行为。接口指定了没有明显联系的类之间的相同行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值