因为在面试的过程中有聊到面向对象,当时给出的答案可能过于简单,所以面试后找到了相关书籍大致看了一下相关的介绍。
说到面向对象开发方法,那就不得不提起另外一种开发方法,那就是结构化开发方法。早期的C,Basic,Pascal等都是依托该方法进行开发,那么结构化开发有什么缺点呢?
首先结构化开发中最小的程序单元是函数,主张的是自顶向下的设计方式,故其主要原则可以概括成为:自顶向下,逐步求精,模块化等。而一个完整的结构化程序设计流程也自然少不了结构化分析(Structured Analysis,SA)去进行需求的分析,然后使用结构化设计(Structured Design,SD)进行详细的设计,最后采用结构化编程(Structured Program)进行系统的实现。
通过图应该也很容易地想到结构化开发的缺点,显而易见的肯定就是设计不够直观,开发者首先需要将客观世界模型拆分成一个一个细小的功能。每个功能对应各自的实现处理;另一个缺点自然就是适应性差,假如用户的需求一旦得到改变,那么当开发人员需要进行修改时,都需要再次采用自顶向下的方式修改模块的结构,这样一来的话,成本就会相当之高。
这个时候,面向对象的开发方法便诞生了,Java便是其中一个基于该方法的编程语言。再次回到结构化开发的方法,模块化的方式虽然有迹可循,但是设计不够直观,无法让人一眼就了解到其中的意思。故此面型对象基于类,对象,继承,封装,多态,消息等基本思想,运用人类一贯的自然思维去思考问题,认识问题,还原出了客观世界中事物以及其相互关系的原始面容。
与结构化开发不同,面向对象的最小程序单元是类。
引用某书籍中的类的定义:类定义=成员变量(Field,状态数据) + 方法(Method,行为)
这个时候就会产生思考了,为什么面向对象的最小程序单元是类,而不是说和结构化开发中的函数或者Field呢?
再次回归到面向对象的思想:运用人类一贯的自然思维去思考问题,认识问题,还原出了客观世界中事物以及其相互关系的原始面容举个例子:假如我们需要组装一辆自行车,如果拿到手的是轮子,座椅,轮子等大颗粒的组件是不是相较于拿到手的是螺丝,铁条等小颗粒的组件更为容易呢?
再比如,运用结构化开发,我们可能对小明吃西瓜应该以如下语句来表达:
吃(小明,西瓜);
但是如果是面向对象开发,我们的表达则为:
小明.吃(西瓜);
可以想到,这个表达和我们日常生活中主谓宾的表达方式如出一辙,所以面向对象更为地接近自然,能够让人更容易理解。
说了这么多,那就应该聊聊面向对象方法地三个重要特征了:封装,继承和多态三大特征缺一不可。
封装 从类的定义中可以看出,指的就是将对象的细节隐藏,然后通过一些公用方法来暴露该对象的功能。
继承 软件复用的一种重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的全部属性和方法。
多态 子类对象可以直接给父类变量,并且依然表现出子类的行为特征。也就是说,同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。
总结:
1. 对象是面向对象的最基本概念,基本特点:标识唯一性,分类性,多态性,封装性,模块独立性好。
2. 类是具有共同属性,方法的一类事物。类是对象的抽象,对象是类的实例。类是整个软件系统最小的程序单元,类通过封装暴露对外提供的功能,提高了类的内聚性,降低了对象之间的耦合性。
3. 对象之间的相互合作需要一个机制协助进行,这样的机制就称之为"消息"。消息是一个实例与另外一个实例之间相互通信的机制。
4. 在面向对象方法中,类之间共享属性和操作称为继承。继承具有传递性,可以分为单继承和多继承。
值得一提的是,由于考虑到会引起继承结构的混乱,降低程序的可理解性,Java不支持多继承。