Java语言中面向对象特性TA:栗志果Email:zhiglee@hotmail.com一切皆对象thinkinjava面向对象编程的基本概念和特征什么是oop?为什么要oop?Oop的一些基本概念Oop的一些准则1例子:栈1)非面向对象方案structStack{inttop;intbuffer[STACK_SIZE];};voidinit(Stack&s){s.top=-1;}boolpush(Stack&s,inti);{if(s.top==STACK_SIZE-1){cout“Stackisoverflow.\n”;returnfalse;}else{s.top++;s.buffer[s.top]=i;returntrue;}}boolpop(Stack&s,int&i){if(s.top==-1){cout“Stackisempty.\n”;returnfalse;}else{i=s.buffer[s.top];s.top--;returntrue;}}……Stackst;intx;init(st);push(st,12);pop(st,x);2)面向对象方案classStack{Private:inttop;intbuffer[STACK_SIZE];public:Stack(){top=-1;}boolpush(inti);{if(top==STACK_SIZE-1){cout“Stackisoverflow.\n”;returnfalse;}else{top++;buffer[top]=i;returntrue;}}boolpop(int&i);{if(top==-1){cout“Stackisempty.\n”;returnfalse;}else{i=buffer[top];top--;returntrue;}}};Stackst;intx;st.push(12);st.pop(x);st.top=-1;//errorst.top++;//errorst.buffer[st.top]=12;//error3)两种方案的简单比较方案1)中对栈的操作可以通过提供的函数来实现,也可以直接在栈的数据表示上直接进行;方案2)中只能通过提供的函数来操作栈。直接操作数据的弊病在于:不安全,易产生错误,并且定位错误较为困难。一旦数据表示发生变化,将影响所有的操作。方案1)需要显式地对栈进行初始化,方案2)则否。2定义面向对象程序设计是把程序构造成由若干对象组成,每个对象由一些数据和对这些数据所实施的操作构成;对数据的操作是通过向包含数据的对象发送消息来实现(调用对象的操作);对象的特性(数据与操作)由(对象)类来描述,一个类的特性可以从其它的类继承。上述的定义包含了下面的基本概念:对象:对象式计算的基本单位,由:接口,数据,操作构成。通信:引起对象式计算的唯一方式。类:对象特性的描述。继承:复用机制。为什么要oop?一个好的软件开发方法或技术的评价标准:开发效率和软件质量保证。开发效率指方法使用的难易程度和方法缩短开发周期的程度等。软件质量包括:外部质量和内部质量。外部质量:软件中与用户有关的质量因素,这里的用户包括最终用户和二次开发用户。包括:正确性(Correctness)、效率(Efficiency)、健壮性或鲁棒性(Robustness)、可靠性(Reliability)、可用性(Usability)和可复用性(Reusability)等方面。内部质量:软件中与软件开发人员有关的质量因素。包括:可读性(Readability)和可维护性(maintainability)等。外部质量靠内部质量来保证。下面就能够保证软件质量的几个程序设计机制来说明面向对象程序设计的优势:1抽象(Abstraction)处理大而复杂问题的重要手段是抽象:强调事物本质的东西。对程序抽象而言,一个语言结构的抽象强调的是该结构外部可观察到的行为,与该结构的内部实现无关。过程抽象(ProceduralAbstraction)结构化程序设计是其典型代表。把子程序的接口和实现分开,使用者只需要知道子程序的接口(功能和参数)而不需要关心其内部实现,适合于基于功能分解的逐步精化(Step-wise)程序设计。过程抽象的不足之处在于:数据与操作的描述分离。数据缺乏保护。不能适应需求的改变。数据抽象(DataAbstraction)以数据为中心,把数据及其操作作为一个整体(对象)来进行描述,对数据的操作由包含数据的对象来提供。面向对象程序设计强调的是数据抽象,一方面加强了数据保护,另一方面实现了对现实世界活动的直接模拟,能较好地适应需求的变化。不足之处在于:对系统的整体功能缺乏清楚的描述。2封装(Encapsulation)把一个语言结构的具体实现细节作为一个黑匣子对该结构的使用者隐藏起来的一种机制,从而符合信息隐藏(InformationHiding)原则。封装考虑的是内部实现,抽象考虑的是外部行为。过程封装实现了操作的封装,而数据是公开的。·数据封装实现了数据及其操作的封装。面向对象程序设计强调的是数据封装。面向对象的基本概念1对象与类(Object&Class)对象是由数据(数据成员、成员变量、实例变量、对象的局部变量)及其操作(操作、方法,成员函数、消息处理过程)所构成的封装体。类是对象特性的描述,一个类刻画了一组具有相同特性的对象,是创建对象的模板。对象是类的实例。对象属于值的范畴,而类属于类型的范畴。对象与类实现数据抽象、封装、模块2继承(Inheritance)与聚集(Aggregation)继承和聚集是实现软件复用的重要设施。在继承机制中,类分为父类(基类)与子类(派生类,衍类),子类除了包含父类的属性以外,也可以定义新的属性,或重新定义父类的属性。可以是单继承(一个类最多有一个直接父类)与多继承(一个类可以有多个直接父类)。在聚集机制中,一个类的数据成员的类型可以是另一个类。3多态(Polymorphism)一般含义是,某一论域中的一个元素可以有多种解释。具体到程序语言,则有以下两个含义:相同的语言结构可以代表不同类型的实体;一名多用或重载(Overloading),如:操作符重载与函数重载。相同的语言结构可以对不同类型的实体进行操作。类属(Genericity),如:类属函数与类属类。多态的作用是提高程序的易扩充性、实现高层软件的复用。良好的OOP风格程序设计风范(Programmingparadigm)和程序设计风格(ProgrammingStyle)。程序设计风范涉及程序设计方法,如:过程式程序设计、对象式程序设计、函数式程序设计以及逻辑式程序设计等。程序设计风格通常指对程序进行静态分析所能确认的特性。结构化程序设计(SP)可以看作是一种良好的过程式程序设计风格。“按照一组能够提高程序易读性与易维护性的规则进行程序设计的方法”(F.T.Baker)。它不仅要求所编出的程序结构良好,而且还要求程序设计过程也是结构良好的。这里,“结构良好”是指:具有单入口、单出口的性质。不包含不会停止执行的语句。没有无用语句。E.W.Dijkstra把结构化程序生动地比喻为“项链上的一串珍珠”。良好的对象式程序设计风格是什么呢?封装和继承是面向对象的两个主要特性,它们在两个层次上(实例和类)强调了模块的可复用性和可维护性,而模块的可复用性和可维护性的关键在于降低模块之间的耦合度。良好的OOP风格的目标是降低模块间的耦合度、增强模块的可复用性。Demeter法则在OOP中,模块间的耦合反映在对象类之间方法的相互调用上,要降低模块间的耦合度,应该对方法中能访问的对象或对象类的集合作一定的限制,并尽量使该集合为最小,从而降低方法对环境的依赖性,这个要求称为Demeter法则。Demeter法则的基本思想是:一个类的方法除了能访问自身类结构的直接子结构(表层子结构)外,不能以任何方式依赖于任何其它类的结构;并且每个方法只应对某个有限类集合中的相应对象发送消息。“纯粹”的面向对象程序设计方法是什么样的?(1)所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。(2)程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。3)每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。(4)每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”。(5)同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP最重要的概念之一。尽管以C++为基础,但Java是一种更纯粹的面向对象程序设计语言为什么一切皆对象?无论C++还是Java都属于杂合语言。但在Java中,设计者觉得这种杂合并不象在C++里那么重要。杂合语言允许采用多种编程风格;之所以说C++是一种杂合语言,是因为它支持与C语言的向后兼容能力。由于C++是C的一个超集,所以包含的许多特性都是后者不具备的,这些特性使C++在某些地方显得过于复杂。Java语言首先便假定了我们只希望进行面向对象的程序设计。也就是说,正式用它设计之前,必须先将自己的思想转入一个面向对象的世界(除非早已习惯了这个世界的思维方式)。只有做好这个准备工作,与其他OOP语言相比,才能体会到Java的易学易用。在本章,我们将探讨Java程序的基本组件,并体会为什么说Java乃至Java程序内的一切都是对象。1.用句柄操纵对象用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电视机。此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。所有对象都必须创建绝对不要清除对象构建我们的一个java程序//Property.javaimportjava.util.*;publicclassProperty{publicstaticvoidmain(String[]args){System.out.println(newDate());Propertiesp=System.getProperties();p.list(System.out);System.out.println(---MemoryUsage:);Runtimert=Runtime.getRuntime();System.out.println(TotalMemory=+rt.totalMemory()+FreeMemory=+rt.freeMemory());}}Theend!Thanks!