01什么是面向过程
在我们没有面向对象的概念的时候我们所编写的程序一般都是面向过程的,我们在程序设计时往往是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;这就是面向过程,
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
比如我们要进行洗衣服操作,我们面向过程的设计就是把打开洗衣机,把水放入,放入衣服,开始洗衣。
而我们如果使用面向对象的方式去定义时,衣服和洗衣机分别是一个对象,洗衣机的开门,蓄水,洗衣,可以作为洗衣机的行为,那么洗衣机就是一个对象,洗衣机通过他的开门的行为,让衣服,放入,洗衣机自动蓄水,洗衣机自动洗衣。这样就是简单的面向对象和面向过程的对比。
在我们开发大型的系统时,如果我们使用面向过程的操作进行操作,那么我们操作过程中一定很复杂,而我们使用面向对象的操作会让我们的事半功倍。
02面向对象概念
●面向对象的方式实际上由OOA(面向对象分析)、OOD(面向对象设计)和OOP(面向对象编程)三个部分有机组成。其中,OOA和OOD的结构需要使用一种方式来描述并记录,目前业界统一采用UML(统一建模语言)来描述并记录OOA和OOD的结果。
●对象是面向对象方法中最基本的概念,它的基本特点有:标识唯一性、分类性、多态性、封装性、模块独立性好。
OOA:由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。在这种方法中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的一般与特殊的关系。组装结构则反映了对象之间的整体与部分的关系
OOD:OOD是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果做进一步的规范化整理,以便能够被OOP直接接受.
OOD是一种解决软件问题的设计范式(paradigm),一种抽象的范式。使用OOD这种设计范式,我们可以用对象(object)来表现问题领域(problemdomain)的实体,每个对象都有相应的状态和行为
OOP:的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面向对象的思想得到了具体的体现
我们的程序设计一般都是经过OOA构建出层次模型,然后通过OOD规划整理,最后到OOP,在有OOA的前提下,OOP过程中我们专注于业务和,数据抽象,构建出一个完成的应用程序
①类是具有共同属性、共同方法的一类事物。类是对象的抽象;对象则是类的实例。而类是整个软件系统最小的程序单元,类的封装性将各种信息细节隐藏起来,并通过公用方法来暴露该类对外所提供的功能,从而提高了类的内聚性,降低了对象之间的耦合性。
②对象间的这种相互合作需要一个机制协助进行,这样的机制称为“消息”。消息是一个实例与另一个实例之间相互通信的机制。
③在面向对象方法中,类之间共享属性和操作的机制称为继承。继承具有传递性。继承可分为单继承(一个继承只允许有一个直接父类,即类等级为树形结构)与多继承(一个类允许有多个直接父类)。
Field(状态数据)+方法(行为)=类定义
Java一切皆对象,在Java编程思想中这样写道:
万物皆对象,
程序是对象的集合,他们通过发送消息来告知彼此所要做的,
每个对象拥有其类型,
某一特定类型的对象都可以接收同样的消息
用引用操作对象:
尽管java把一起都看为一个对象,但是操作的标识符实际上是对象的一个“引用”。比如Strings;这里只创建了个引用,但是并未创建对象。对于创建对象的方式我们可以通过以下几个方式:
new关键字
Class.forName().newInstancce().
Constructor类的newInstance()构造函数会被调用
clone()方式
deserialization反序列化方式
创建对象:
new将对象存储在堆中,所以用new创建一个对象---特别小的,简单的变量,往往不是很有效。因此对于(基本类型)java不用new来创建这样的变量,而是创建一个并非是引用的“自动”变量。这个变量的值直接存储"值"到堆栈中。
程序创建,运行时对象是如何分配呢?内存是怎样分配呢?
new出来的对象是存放在堆中的,我们的对象的引用是存放在栈中,在栈中存放的是对象的引用。
堆栈:位于RAM中,堆栈指针可以从处理器获得直接支持,堆栈指针向上移动,释放内存。堆栈指针向下移动,分配新的内存。创建程序时java必须知道存在堆栈内所有项的确切的生命周期。以便上下移动堆栈指针,一般“对象引用"存储于其中。
堆:堆通常是内存池。用于存在java对象。堆不同于堆栈的是:编译器不需知道存在堆里的数据存活多久,因此在堆中分配存储,有很大的灵活性,当需要一个对象时只需new出即可。这是要付出代价就是,堆中的不用的对象何时回收内存问题。
常量存储:常量值通常直接存在程序代码内部,因为他们永远不会改变。
非RAM存储:如果数据完全存活于程序之外,那么他可以不受程序的任何控制,在程序没有运行时也是可以存在,比如流对象和持久化对象。
对于其他jvm中的结构将在jvm学习中进行讲解。这里暂时不再做具体说明。
面向对象的特征:
(1)对象唯一性。
每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。
(2)抽象性(封装)。
抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
(3)继承性。
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。Java不支持多继承。在java中我们需要使用类似于多继承的现象,我们需要使用接口,进行同时实现j接口中不同的方法。在开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重用性。采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。
(4)多态性(多形性)
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。多态性允许每个对象以适合自身的方式去响应共同的消息。多态性增强了软件的灵活性和重用性。
好了。这就是我们需要了解的面向对象的概念。我们应该去实践,只有实践才能够真正地了解到其中的内涵。