java基础之关于面向对象和面向过程的理解

本文主要探讨java的面向对象思想,顺带探讨面向过程的思想。

1.首先看一下面向过程

1.1简介

面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

1.2与面向对象的比较

面向对象”(Object Oriented,简称OO)是一种以事物为中心的编程思想。
面向对象的程序设计(Object-Oriented Programming,简记为OOP)
比如以公共汽车而言。
“面向过程”就是汽车启动是一个事件,汽车到站是另一个事件。在编程序的时候我们关心的是某一个事件。而不是汽车本身。我们分别对启动和到站编写程序。类似的还有修理等等。

1.3编程实现

到了编程就是:
public class 汽车运营
{
void 汽车启动
{
}
void 汽车到站
{
}
}
面向对象”需要建立一个汽车的实体,由实体引发事件。我们关心的是由汽车抽象成的对象,这个对象有自己的属性,像轮胎,颜色等;有自己的方法,像启动,行驶等.方法也就是汽车的行为.而不是汽车的每个事件。
public class 汽车
{
void 到站()
{
}
void 启动()
{
}
}
使用的时候需要建立一个汽车对象,然后进行应用。

1.4总结

面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法.它考虑的是实际地实现.一般的面向过程是从上往下步步求精.所以面向过程最重要的是模块化的思想方法.对比面向过程,面向对象的方法主要是把事物给对象化,对象包括属性与行为.当程序规模不是很大时,面向过程的方法还会体现出一种优势,因为程序的流程很清楚,按着模块与函数的方法可以很好的组织.比如拿学生早上起来的事情来说说这种面向过程吧.粗略的可以将过程拟为:
(1)起床
(2)穿衣
(3)洗脸刷牙
(4)去学校
而这4步就是一步一步地完成,它的顺序很重要,你只须一个一个地实现就行了.而如果是用面向对象的方法的话,可能就只抽象出一个学生的类,它包括这四个方法,但是具体的顺序就不能体现出来.

2.关于面向对象

Java语言是纯粹的面向对象的程序设计语言,这主要表现为Java完全支持面向对象的三种基本特征:继承、封装和多态。Java语言完全以对象为中心,Java程序的最小程序单位是类,整个Java程序由一个一个的类组成。

Java完全支持使用对象、类、继承、封装、消息等基本概念来进行程序设计,允许从现实世界中客观存在的事物(即对象)出发来构造软件系统,在系统构造中尽可能运用人类的自然思维方式。实际上,这些优势是所有面向对象编程语言的共同特征。而面向对象的方式实际上由OOA(面向对象分析)、OOD(面向对象设计)和OOP(面向对象编程)三个部分有机组成,其中,OOA和OOD的结构需要使用一种方式来描述并记录,目前业界统一采用UML(统一建模语言)来描述并记录OOA和OOD的结果。目前UML的最新版是2.0它一共包括13种类型的图形,使用这13种图形中的某些就可以很好地描述并记录软件分析、设计的结果。

2.1简介

 面向对象的基本思想是使用类、对象、继承、封装、消息等基本概念来进行程序设计。

    采用面向对象方式开发的软件系统,其最小的程序单元是类,这些类可以生成系统中的多个对象,而这些对象则直接映像成客观世界的各种事物。采用面向对象方式开发的软件系统逻辑上的组成结构。如图所示:

java基础之关于面向对象和面向过程的理解

从图上可以看出,面向对象的软件系统由多个类组成,类代表了客观世界上具有某种特征的一类事物往往有一些内部的状态数据,比如人有身高、体重、年龄、爱好等各种状态数据--当然程序没有必要记录该事物所有的状态数据,程序只要记录业务关心的状态数据即可。

面向对象的语言不仅使用类来封装一类事物的内部状态数据,这种状态数据就对应于图中的Field;而且类会提供操作这些状态数据的方法,还会为这类事物的行为特征提供相应的实现,这种实现也是方法。因此:可以得到如下基本等式:

                                                                        Field(状态数据)+方法(行为)=类定义

  从这个等式来看,面向对象比面向过程的编程粒度要大;面向对象的程序单位是类;而面向过程的程序单位是函数(相当于方法)因此面向对象比面向过程更简单、易用。我们举个例子来说,希望完成“把大象装冰箱”这样一件事情。

                         面向过程的思维:装(大象,冰箱);     面向对象的思维:冰箱.装(大象);

2.2面向对象的特征

面向对象方法具有三个基本特征:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism),其中封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;多态指是的子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,

    面向对象还支持如下几个功能:

     1)对象是面向对象方法中最基本的概念,它的基本特点是:标识唯一性、分类性、多态性、封装性、模块独立性好。

     2)类是具有共同属性、共同方法的一类事物。类是对象的抽象;对象则是类的实例。而类是整个软件系统最小的程序单元,类的封装性将各种信息细节隐藏起来,并通过公用方法来暴露该类对所提供的功能,从而提高了类的内聚性,降低了对象之间的耦合性。

     3)对象间的这种相互合作需要一个机制协助进行,这样的机制称为“消息”。消息是一个实例与另一个实例之间相互通信的机制。

     4)在面向对象方法中,类之间共享属性和操作的机制称为继承。继承具有传递性。继承可分为单继承(一个继承只允许有一个直接父类,即类等级为树形结构)与多继承(一个类允许有多个直接父类),但Java不支持多继承。

2.3总结

在Java语言中除了8个基本数据类型值之外,一切都是对象,而对象就是面向对象程序设计的中心。对象具有状态,一个对象用数据值来描述它的状态。Java通过对对象定义Field(以前常被称为属性,现在也称字段)来描述对象的状态;对象还有操作,这些操作可以改变对象的状态,对象的操作也被称为对象的行为,Java通过为对象定义方法来描述对象的行为。

       对象是Java程序的核心,所以在Java里的对象具有唯一性,每个对象都有一个标识来引用它,如果某个对象失去了标识,这个对象将变成垃圾,只能等着系统垃圾回收机制来回收它。Java语言不允许直接访问对象,而是通过对对象的引用来操作对象。

在Java语言使用class关键字定义类,定义类时可使用Field来描述该类对象的数据,可使用方法来描述该类对象的行为特征。Java语言使用extends关键字来表示继承关系。

Java使用new关键字来创建指定类的对象,每个类可以创建任意多个对象,多个对象的Field值可以不同。

3.代码实现

还是以上面的“把大象装冰箱”来探讨面向随想和面向过程的区别与联系
分析一下需求
第一步:把冰箱门打开;
第二步:把大象装进去;
第三步:把冰箱门关上。

3.1运用面向过程的思想来实现

ProcedureOriented
[java] view plain copy
  1. package com.baosight.test;  
  2.   
  3. /**面向过程测试类 
  4.  * <p>Title:ProcedureOriented </p> 
  5.  * <p>Description:TODO </p> 
  6.  * <p>Company: </p>  
  7.  * @author yuan  
  8.  * @date 2016-5-7 上午10:25:16*/  
  9. public class ProcedureOriented {  
  10.   
  11.     public static void main(String[] args) {  
  12.         // TODO Auto-generated method stub  
  13. //      System.out.println("把冰箱门打开");  
  14. //      System.out.println("把大象装进去");  
  15. //      System.out.println("把冰箱门关上");  
  16.         open();  
  17.         in();  
  18.         close();  
  19.     }  
  20.   
  21.     /**  
  22.      * @Title: close  
  23.      * @Description: TODO  
  24.      * @return void   
  25.      * @author yuan 
  26.      * @date 2016-5-7上午10:33:37 
  27.      */   
  28.     private static void close() {  
  29.         // TODO Auto-generated method stub  
  30.         System.out.println("把冰箱门关上");  
  31.     }  
  32.      /**  
  33.      * @Title: in  
  34.      * @Description: TODO  
  35.      * @return void   
  36.      * @author yuan 
  37.      * @date 2016-5-7上午10:33:07 
  38.      */   
  39.     private static void in() {  
  40.         // TODO Auto-generated method stub  
  41.         System.out.println("把大象装进去");  
  42.     }  
  43.   
  44.     /**  
  45.      * @Title: open  
  46.      * @Description: TODO  
  47.      * @return void   
  48.      * @author yuan 
  49.      * @date 2016-5-7上午10:32:43 
  50.      */   
  51.     private static void open() {  
  52.         // TODO Auto-generated method stub  
  53.         System.out.println("把冰箱门打开");  
  54.     }  
  55.   
  56. }  

3.2运用面向对象的思想来实现

须向创建大象类/冰箱类,冰箱类中2个方法,打开和关闭,大象类1个方法,装
Elephant
[java] view plain copy
  1. package com.baosight.test;  
  2.   
  3. /**大象类 
  4.  * <p>Title:Elephant </p> 
  5.  * <p>Description:TODO </p> 
  6.  * <p>Company: </p>  
  7.  * @author yuan  
  8.  * @date 2016-5-7 上午10:27:16*/  
  9. public class Elephant {  
  10.     public void in() {  
  11.         System.out.println("把大象装进去");  
  12.     }  
  13. }  
Refrigerator
[java] view plain copy
  1. package com.baosight.test;  
  2.   
  3. /**冰箱类 
  4.  * <p>Title:Refrigerator </p> 
  5.  * <p>Description:TODO </p> 
  6.  * <p>Company: </p>  
  7.  * @author yuan  
  8.  * @date 2016-5-7 上午10:29:03*/  
  9. public class Refrigerator {  
  10.     public void open() {  
  11.         System.out.println("把冰箱门打开");  
  12.     }  
  13.   
  14.     public void close() {  
  15.         System.out.println("把冰箱门关上");  
  16.     }  
  17. }  

测试类ObjectOrientedDemo
[java] view plain copy
  1. package com.baosight.test;  
  2.   
  3. /**面向对象测试类 
  4.  * <p>Title:ObjectOrientedDemo </p> 
  5.  * <p>Description:TODO </p> 
  6.  * <p>Company: </p>  
  7.  * @author yuan  
  8.  * @date 2016-5-7 上午10:31:52*/  
  9. public class ObjectOrientedDemo {  
  10.   
  11.     public static void main(String[] args) {  
  12.         // TODO Auto-generated method stub  
  13.         //大象类  
  14.         Elephant elephant = new Elephant();  
  15.         //冰箱类  
  16.         Refrigerator refrigerator = new Refrigerator();  
  17.         //打开冰箱  
  18.         refrigerator.open();  
  19.         //装进大象  
  20.         elephant.in();  
  21.         //关闭冰箱  
  22.         refrigerator.close();  
  23.     }  
  24.   
  25. }  
上面2种实现的运行结果是一致的
java基础之关于面向对象和面向过程的理解
上面简单讲述了面向对象和面向过程的联系与区别,值得一提的是虽然Java等现在流行的语言是面向对象的,但是,作为编程语言基础的C语言是面向过程的。在实际的使用中,面向对象和面向过程的思想是紧密联系的。