面向对象技术(Java)课件第3章 面向对象基本原理和Java实现_第1页
面向对象技术(Java)课件第3章 面向对象基本原理和Java实现_第2页
面向对象技术(Java)课件第3章 面向对象基本原理和Java实现_第3页
面向对象技术(Java)课件第3章 面向对象基本原理和Java实现_第4页
面向对象技术(Java)课件第3章 面向对象基本原理和Java实现_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课堂目标理解面向对象设计的基本概念和原理掌握如何设计类和创建对象掌握Java中的引用和引用变量掌握方法的重载原理掌握构造方法、this关键字的含义理解toString方法、equals方法、getter和setter方法等进一步理解垃圾回收机制在面向对象程序设计中,我们可以从大量的客观实际对象当中抽象出一个个代码类,类中有描述对象内部结构状态的数据编码部分,还有描述此对象具有的功能和行为的指令编码部分。而在计算机进程中对象又是类的具体化实例,用一个设计好的类可以创建许多对象。简单说类就是对象的代码抽象(包括数据和指令),是创建对象的代码模板,对象是类的具体化的实例,类似生命世界中DNA编码和生命体的关系。对象较结构化程序设计中讲到的函数、过程更有逻辑意义,人类认识世界就是从一个个基本的实际对象开始的,所以面向对象程序设计具有现实的认知基础。面向对象程序设计数据代码指令代码=++能量面向对象理论认为:系统中一切皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式。对象和类是面向对象程序设计的核心概念,程序员使用对象和类进行程序设计。类可以分成两种,一种是程序员可以直接使用的类,是由JDK提供的或其他人写好的;另一种需要程序员自行设计。设计一个类大致可分为两步:要对现实世界的实体或系统进行抽象,抽取其合适的状态和行为,形成思维中的类;用Java语言来描述思维中的类,使思维中的类成为Java的类。java面向对象程序设计要点理解面向对象编程对象可以表示现实世界中某个具体的事物、系统,也可以表示抽象的过程或概念。对象具有两方面的含义:是一个可以从其赖以存在的“系统”中分离的“个体”有可以“观察”的数据部分和可以“交互”的功能部分组合而成。对象作为一个可以显现给外围系统的一个实例,既是构成外围系统小元素,也是具有独立存在和演化的小系统。类和对象的关系类是具有共同数据和程序的对象抽象,是创建实例对象的代码模板。类可以理解为代码的一种存储状态,通过实例对象(运行状态)进入进程世界。可类比DNA编码对象可理解为进程中的一个有时空概念的实例,类似于生命体。对象属性或状态操作或行为类抽象实例化数据或变量方法封装的实体=数据(物质组成)+方法(功能)汽车对象和类既有区别又有联系,类是创建实例对象的代码模板,而对象则是在进程中按照类模板创建出来的一个个实例,有点像汽车的设计图纸和汽车的关系。采用面向对象程序设计技术的原因主要有两个,其一是我们认识世界研究乃至于改造世界都是以“对象”为基本单位而进行的,我们将这一人类活动衍生到计算机编程中来顺理成章;其二是为了提高程序设计的效率,尤其是在越来越复杂问题环境中,解决模块的颗粒度问题,既内聚性和耦合性的分界线问题。类设计语法成员变量(用来描述对象的属性):[修饰符]类型变量名[=初值][,变量名[=初值]…];说明:(1)类型:可以是Java的基本类型,如int,float等,也可以是复杂类型,如我们自己定义的类,或者数组、接口等。(2)变量名:必须是合法的Java标识符。(3)修饰符:说明变量的访问权限和某些使用规则。可以是public,private,protected,static,final等,后面会一一讲到。(4)当成员变量含有自己的初始化表达式时,可以对变量初始化,即赋初值。成员方法(用来描述对象的行为):[修饰符]返回类型方法名([形式参数列表])[throws异常列表]{方法体}说明:(1)返回类型:说明此方法执行完后会返回一个值,这里指的是返回值的数据类型,可以是基本类型,也可以是复杂类型。如果返回类型为void,表示返回值为null,既不返回任何值。(2)方法名:方法的名称,必须是合法的Java标识符。(3)形式参数列表:说明使用此方法所需要的参数列表,可以有0个或多个,多个参数间用逗号“,”隔开。在方法执行时,调用者会将调用时的实际参数值复制(传递)一份到形参变量中(也称按值传递),传递过程是按照顺序依次对应传递的。(4)修饰符:同前面变量,说明此方法的访问权限和某些使用规则。可以是public,private,protected,static,abstract和final等。(5)方法体:用一对花括号“{}”括起来,包含局部变量定义和相应的执行语句。(6)异常列表:说明本方法有可能产生的异常,需要调用者处理,后面会详细讲。成员变量(属性)和成员方法(行为)消息(即方法调用)哲学上不存在孤立系统,同样程序不存在孤立对象,通过许多对象相互作用,可以实现高层次的操作和更复杂的功能。对象之间的相互作用是通过消息实现的一个消息通常由三部分组成:接受消息对象的名称要执行方法的名称方法需要的参数消息的本质其实是方法调用

Studentstu=newStudent(“10001”,“张三”);

stu.moveto(“兰州”);//给stu发消息引用类型进阶s1s210001astring10001classMydate{intyear;intmonth;intday;}

Mydatetoday=newMyDate()00010008todays2=s1;s1=newString(“astring”);Example:

Strings1;Strings2;基本变量vs引用变量

25a3000inta=25;

200495yearmonthdayMyDatedt=newMyDate();5000dt50004000对象引用作为参数classTest{inta,b;

Test(inti,intj){a=i;b=j;}//可以在方法中改变对象状态

voidchange(Testobj){obj.a=50;obj.b=40;}}

当对象作为方法参数时,在方法中只能改变该对象的状态,但不能改变该对象的引用voidswapobj(Datex,Datey){

Datetemp=y;y=x;x=temp;}

引用本身按值传递Date2002,5,30Date2003,7,23obj1obj2调用swapobj(obj1,obj2)可改变对象状态xyxyimportjava.util.Scanner;publicclassComplexextendsObjectimplementsCloneable{privatedoublerealpart;privatedoubleimaginarypart;publicComplex(){realpart=0;imaginarypart=0;}//默认构造方法publicComplex(doubles,doublex){realpart=s;imaginarypart=x;}//构造方法publicvoidinputme(){Scannerkeyin=newScanner(System.in);System.out.print("real:");realpart=keyin.nextDouble();System.out.print("imaginary:");imaginarypart=keyin.nextDouble();}publicvoidprintme(){Stringstr=""+realpart;if(imaginarypart<0.0)str=str+imaginarypart+"i";elsestr=str+"+"+imaginarypart+"i";System.out.println(str);}}复数类Complex示例构造方法对象是类实例化后的产物,所谓实例化是按照类的设计创造对象的过程,就是给此对象分配内存空间并初始化,即要进行一系列的构造工作,使其变成一个合适的、可用的对象,这就是构造方法所完成的工作,类似于现实世界中动物对象的分娩或孵化过程。l构造方法是类中一个特殊的方法,特殊之处在于此方法第一要与类名同名,第二方法不能有返回类型。l构造方法不能有返回类型并不能代表它不能有返回值,实际上它要返回对象在内存中的开始地址。l构造方法可以重载,并且我们把没有任何参数的构造方法称为默认构造方法。如前例中的Complex()是默认构造方法,而Complex(doubles,doublex)则是带有两个形参的构造方法。创建对象使用下列语法可创建对象:

new构造方法关键字new通常称为创建运算符,用于分配对象内存,并将该内存初始化为缺省值。一旦new完成分配和初始化内存,它就将调用构造方法来执行对象初始化。创建对象后没有引用变量指向它,则为匿名对象,如:newComplex(3.0,5.0).printme();//创建匿名对象并调用printme方法当创建一个类时,只是创建了一种新的数据类型。对象是类的一个实例。publicclassTesstComplex{publicstaticvoidmain(String[]args){Complexm1=newComplex(3.4,8.0);m1.inputme();//调用inputme()方法,即给m1对象发输入请求的消息m1.printme();//调用printme()方法,即给m1对象发打印输出的消息}}创建对象对象创建后成员变量初始值Java保证了在任何代码使用该内存之前,已至少将内存初始化为可预知的缺省值类型缺省值类型缺省值byte(byte)0char'\u0000'short(short)0float0.0Fint0double0.0Dlong0L对象引用nullbooleanfalsethis关键字publicclassPassTest{

intx;PassTest(intx){

this.x=x;}publicvoidpassingValue(){System.out.println(“x等于"+x);

}publicstaticvoidmain(Stringargs[]){PassTesttest=newPassTest(10);test.passingValue(); }}

关键字this与对象关联它是引用用于指示当前对象指明此对象的变量x应赋值为通过构造函数传递的自变量x的值。

方法重载(overloading)方法重载是Java实现面向对象的多态性机制的一种方式。同一个类中多个方法有相同的名字,不同的参数列表,这种情况称为方法重载。返回类型不同并不足以构成方法重载,必须还要有参数不同。当重载方法被调用时,编译器根据参数的类型和数量来确定实际调用哪个重载方法的版本。方法重载是静态绑定的,即在编译时,已确定好要执行的方法代码。方法重载示例classCalculation{ publicvoidadd(inta,intb){ intc=a+b; System.out.println("两个整数相加得"+c); } publicvoidadd(floata,floatb){ floatc=a+b; System.out.println("两个浮点数相加得"+c); } publicvoidadd(Stringa,Stringb){ Stringc=a+b; System.out.println("两个字符串相加得"+c); } publicvoidadd(Complexa,Complexb){ Complex1f1=newComplex1(a.shibu+b.shibu,a.xubu+b.xubu); System.out.println("两个复数相加得"+f); }}publicclassCalculationDemo{ publicstaticvoidmain(Stringargs[]){ Calculationc=newCalculation(); c.add(10,20); c.add(40.0F,35.65F); c.add("早上","好"); Complexf1=newComplex(3.4,2.8); Complexf2=newComplex(1.6,-7.8); f1.display(); f2.display(); c.add(f1,f2); }}编译器决定调用版本Complex1为复数类的进化版,参看教材19重载构造方法如果程序员没有提供构造方法,Java会为类自动提供一个缺省构造方法。缺省构造方法将成员变量初始化为缺省值。一旦程序员提供了自己的构造方法,Java则不会再提供缺省构造方法。重载构造方法提供了一组创建对象的方式,可以根据需要决定是否带初始参数。publicclassconstructOverload{intx,y;constructOverload(){x=0;

System.out.println("不带参数的构造方法");}

constructOverload(intx){this.x=x;System.out.println("带一个参数的构造方法");}

constructOverload(intx,inty){this(x);this.y=y;System.out.println(“两个参数的构造方法”);}}getter方法和setter方法设计

Java语言针对被私有化的成员变量可以提供访问的方法:getter方法用来读取对象成员变量的值setter方法用来修改对象成员变量的值我们正是通过提供一系列的get方法和set方法去读写这些对象内部的成员数据,在这些方法中我们可以过滤传进来的参数,就像人的消化系统一样,所有的食物经过消化系统后变成了对人有用的营养,而非法数据则被过滤,这就是对象对外提供的交换接口。例如:publicStringgetName(){returnname;}publicvoidsetName(Stringn){name=n;}publicchargetSex(){returnsex;}publicvoidsetSex(chars){sex=(s=='F')?s:'M';}用getter方法保护敏感数据不会泄露,用setter方法过滤非法输入数据!equals()方法&hashcode()方法用于比较两个对象是否相等,相等返回trueObject类中提供的equals方法使用恒等函数来确定对象是否相等即只能用来判断两个不同的对象是否指向同一个内存区域。子类一般通过修改Object的equals方法实现有意义的测试,可以实现:若同一类型的两个不同对象包含相同的信息即返回true。通用的equals方法的标准写法建议如下例所示。publicbooleanequals(Objectobj){ if(this==obj) returntrue; if(obj==null) returnfalse; if(getClass()!=obj.getClass()) returnfalse; Complex1other=(Complex1)obj; if(imaginarypart!=other.imaginarypart||realpart!=other.realpart)returnfalse; returntrue;}Complex1one=newComplex1(3.0,4.0);Complex1anotherOne=newComplex1(3.0,4.0);if(one.equals(anotherOne))System.out.println("对象内容相等");if(one==anotherOne)System.out.println(“它们指向同一个对象!”);//理解equals方法和==相等比较的不同。hashcode()methodisusedtoproducedahashcodewhichassociatedwithanobject.HashcodesShouldbescrambled----ifxandyaretwodistinctobjects,thereshouldbeahighprobabilitythatx.hashcode()andy.hashcode()aredifferent.publicinthashCode(){ finalintprime=31; intresult=1; longtemp; temp=Double.doubleToLongBits(imaginarypart); result=prime*result+(int)(temp^(temp>>>32)); temp=Double.doubleToLongBits(realpart); result=prime*result+(int)(temp^(temp>>>32)); returnresult;}toString()方法toString方法用于返回对象的字符串表示。Object类中的实现非常简单,直接返回对象的引用,建议所有的子类都应给出此方法。使用“+”运算符将对象同一个字符串连接,Java编译器会自动调用toString方法,获取对象的字符串表现形式。publicStringtoString(){Stringstr=""+realpart;if(imaginarypart<0.0)str=str+imaginarypart+"i";elsestr=str+"+"+imaginarypart+"i";returnstr;}Complex2m1=newComplex2(4.4,-8.9);System.out.println("m1="+m1);自动调用toString方法,获取对象的字符串表示形式其他功能方法设计在类的设计中,除了针对封装属性提供的接口和重写从父类中继承的方法外,每一个类都应该有自己独特的功能方法,如针对【例3-4】中复数类给出的加减等方法,【例3-6】中学生类,可以添加求总分以及输入数据等方法。publicdoubletotal(){doublesum=0.0;for(inti=0;i<coursescores.length;i++){sum+=coursescores[i];}returnsum;}publicvoidinputData(){Scannerin=newScanner(System.in);System.out.println("请输入"+name+"的成绩:");for(inti=0;i<coursescores.length;i++){System.out.print(coursenames[i]+":");coursescores[i]=in.nextDouble();}}抽象和封装举例假如我们现在要做一个班级成绩管理系统,首先应该能输入和保存一个班级的信息以及学生的相关信息,如何抽象、如何封装?一种方案如下:1、抽象学生类:Student2、抽象班级类:Myclass3、测试学生类4、测试班级类5、主控程序类面向对象程序设计的基本原理从前面章节的知识和程序语言发展的历史来研究面向对象程序设计理论,所谓面向对象其实就是在程序设计的发展历史中逐渐形成的一套设计理论,并且还在继续完善中。就当下来看,整个面向对象程序设计理论主要建立在以下几条原理之上:l抽象原理l封装原理l继承原理l多态原理l组合原理抽象原理抽象就是从大量的普遍的个体中抽象出共有的属性和行为,从而形成一般化概念的过程。在现实世界中,人们正是通过抽象来理解复杂的事物。例如,人们并没有把汽车当作成百上千的零件组成来认识,而是把它当作具有自己特定行为的对象。我们可以忽略发动机、液压传输、刹车系统等如何工作的细节,而习惯于把汽车当作一个整体来认识。如果从一个抽象模型中剔除足够多的细节,则它将变得足够通用,足以适应于多种情况或场合,这样的抽象常常在程序设计中非常有用。经过对大量事物的抽象和归类,可以形成相应的类属层次,如下图就是一个自然界各事物的一个分类抽象:抽象原理下面我们通过一个示例来展示抽象原理,假设我们要在屏幕上用“*”打印矩形,可以把此矩形看成一个对象,用面向对象的思维来进行分析和抽象,所有的矩形都有宽(w)和高(h),并且在屏幕上有一个位置,而位置是由形如(x、y)的坐标标识出来的,所以最简单的抽象就是通过(w、h、x、y)来定义一个矩形类(Rectangle),然后提供一个printme()方法在屏幕上打印出这个矩形。类图如图3-2所示,参考Java代码示例如下:图3-2Rectangle类publicclassRectangle{intx,y,w,h;Rectangle(){this(0,0,1,1);}publicRectangle(intx,inty,intw,inth){ this.x=x; this.y=y; this.w=w; this.h=h;}publicvoidprintme(Screenmyscreen){ myscreen.setY(y);for(inti=1;i<=h;i++){ myscreen.setX(x); myscreen.repeat('*',w);myscreen.println();}}}同样的需要抽象“屏幕”类封装原理封装原理是一个普适性原理,正如我们看到的、我们学习到的、以及我们周围的一切实体,包括动物、植物、各种人造物品都是封装的,一般情况下,我们只能看到这些物体的“外壳”,看不到其内部结构。这种将内部结构和功能对外隐藏,只留下必需的接口和外界进行能量或信息交流就是封装,比如说我们人类,我们的内脏、血管、神经都被封装在我们皮肤里面,对外表现出来的仅仅是皮肤和五官接口,也就是说我们都是内聚性很强的对象个体,但我们又留有眼耳鼻口等接口,我们通过这些接口在这个世间生存和忙碌。在面向对象程序设计中,我们应该遵循同样的原理,将对象的内部结构对外作信息隐藏,让外部不可访问,但提供一系列的公有接口,用来进行信息和能量交换。在java语言中,实现封装的关键字是private,提供接口的关键字是public,如图3-4所示。图3-4封装示意图前面抽象了屏幕类(Screen),矩形类(Rectangle),并且用一个测试程序完成了测试。但有个问题,如果我们在测试程序中,直接修改矩形对象的内部数据,就会造成数据混乱,这些矩形对象已经不是原来的矩形对象了,因为没有封装这是很难避免的,参考【例3-11】。如何防止数据被非法修改,这就需要使用封装技术。在Java语言中,实现封装的关键字是private,提供公有接口的关键字是public。实现封装需要两步,第一步,将对象内部的属性数据用private修饰,这样其他对象就无法直接访问和修改了,并且有些属性在对象创建后再不允许修改,则此类属性应该定义为常量;第二步,对于需要访问的属性提供读值方法getter,并需要特定代码对数据进行处理,根据安全需要可隐藏某些数据;对于需要修改的属性提供写值方法setter,并且在方法中提供约束和过滤代码,保证合法数据进入,阻挡非法数据进入。实现封装后屏幕类的代码如下,参考【3示例-13】:封装原理public

classScreen{private

final

intSCREEN_WIDTH;private

final

intSCREEN_HEIGHT;private

intx;private

inty;private

char[][]data;public

intgetX(){

returnx;}public

voidsetX(intx){

if(x<SCREEN_WIDTH)this.x=x;}public

intgetY(){

returny;}public

voidsetY(inty){

if(y<SCREEN_HEIGHT)this.y=y;}publicScreen(){ SCREEN_HEIGHT=50; SCREEN_WIDTH=80; data=newchar[SCREEN_HEIGHT][SCREEN_WIDTH];}publicScreen(intr,intc){//通过判断对输入的数据进行过滤 if(r>=1&&r<=1000) SCREEN_HEIGHT=r; else SCREEN_HEIGHT=50; if(c>=1&&c<=1000) SCREEN_WIDTH=c; else SCREEN_WIDTH=80; data=newchar[SCREEN_HEIGHT][SCREEN_WIDTH];}publicvoidinit(){ for(inti=0;i<SCREEN_HEIGHT;i++){ for(intj=0;j<SCREEN_WIDTH;j++){ data[i][j]=''; } }}。。。继承原理继承原理也是一个普适原理,如果没有继承,我们的生物世界就会永远在生物链的底端徘徊,就不会出现如此丰富的生态世界。继承是发展的一部分,只有不断地继承旧的、成熟的东西,才能发展出更新的、更先进的东西,否则,我们就会在原地踏步,永远重复。在面向对象程序设计中,我们从已经存在的类产生新类的机制,我们也称之为继承,原来存在的类叫父类(或叫基类),新类叫子类(或叫派生类)。子类中会自动拥有父类中的设计代码,继承带来的好处是:一方面可减少程序设计的错误,另一方面,做到了代码复用,可简化和加快程序设计,提高了工作效率。继承不仅仅是简单的拥有父类的设计代码,继承机制本身就具有进化的能力,跟生物世界一样,子代总是比父代更能适应环境。我们通过对父类的设计作一些局部的修改,使得子类对象具有更好的适应能力和强大的生存能力。publicclassTestInherit{publicstaticvoidmain(String[]args){Screenmyscreen=newScreen(25,80);myscreen.cls();Lingxingmylx=newLingxing(0,0,9);mylx.printme(myscreen);Lingxingmylx2=newLingxing(20,1,12);mylx2.printme(myscreen);Rectanglerc=newRectangle(14,1,5,7);rc.printme(myscreen);Triangletr=newTriangle(56,2,7);tr.printme(myscreen);Circlec=newCircle(34,0,10);c.printme(myscreen);myscreen.display(); }}继承原理从教材【3-14】例可以看出,Shape类是各种图形的抽象父类,从而可以派生出各种具体的图形类,如Rectangle、Triangle等,子类自动拥有父类中的成员变量x,y,同时继承下来了父类中的各种公有成员方法,各子类有根据自己形状的特点,给出了printme()方法的覆盖实现,从而为实现多态打好了基础。继承提供的是is-a关系,即父类相对于子类更为抽象,子类更为具体,子类对象同样隶属父类型。TestInherit类中对以上各种子类进行了测试,测试结果如图所示:多态原理多态性原理是生物多样性在面向对象程序设计中的应用,正如第一章我们说过的一样,面对同样的刺激、消息等,不同的动物的反应是不一样的。在面向对象程序设计中,如果我们有许多不同的对象,每个对象都具有相应的行为模式(即执行代码),通过对每个对象发送同样的消息,但每个对象的执行的代码是不一样的,这就是面向对象程序设计中的多态。多态性(polymorphism)是面向对象编程的基础属性,它允许多个方法使用同一个接口,从而导致在不同的上下文中,对象的执行代码可以不一样。Java从多个方面支持多态性,其中两个方面最为突出。第一个是每个方法都可以被子类重写;第二个是设立interface关键字。鸟蛇鱼人马蚂蚁move鸟蛇鱼人马蚂蚁A地区B地区多态原理由于超类(父类)中的方法可以在派生类(子类)中重写,因此创建类的层次结构非常重要。在类的层次结构中,每个子类都是它的父类的特化(specialization)或具体化。从类属关系上来讲,属于底层类的对象肯定属于高层类,例如,小学生类是学生类的子类,学生类是人类的子类等等,如果张三是一个小学生,则张三一定是一个学生,并且张三一定是一个人类。在Java中父类的引用可以指向子孙类对象,从而可以通过父类引用来调用子类对象的方法。在Java中,多态是通过动态绑定来实现的,通过父类的引用调用某子类对象的一个方法时,会自动执行由该子类重写后的版本。publicclassTestPolymorphism{publicstaticvoidmain(String[]args){Screenmyscreen=newScreen(25,80);myscreen.cls();Shapeshapes[]=newShape[5];//通过父类定义了有5个引用变量的数组shapes[0]=newLingxing(0,0,9);//指向一个菱形对象shapes[1]=newLingxing(20,1,12);shapes[2]=newRectangle(14,1,5,7);//指向一个矩形对象

shapes[3]=newTriangle(56,2,7);//指向一个三角形对象shapes[4]=newCircle(34,0,10);//指向一个圆形对象for(inti=0;i<shapes.length;i++){shapes[i].printme(myscreen);//方法调用相同,但因对象不同执行代码也不同,这就是多态性原理}myscreen.display();}}组合原理在现实世界中我们常会看到一个复杂对象总是有许多子对象构造而成,如汽车对象包含了发动机对象、轮胎对象、方向盘对象等,一个宠物狗对象也会包含心、肝、脾、肺等等。在面向对象程序设计中我们常用组合来完成从简单对象到复杂对象的构造过程,一个复杂对象常常是有多个简单的成员对象组合而成,比如一个汽车对象由“发动机”、“刹车”、“方向盘”等对象组装而成。相对于继承的is-a关系,我们常说组合是has-a关系,即整体和部分的关系。使用组合的原因是通过组合可以降低构建系统的复杂性,这也是人们解决复杂问题的通用方式。组合通常有两种方式:联合和聚合。

这些方式代表了对象之间不同的协作关系。任何组合类型都是has-a关系。然而,联合和聚合的微小区别在于部分如何构成整体。在聚合中,通常只看到整体,如手机或电视机,而在联合中,通常看到的是组成整体的部分,如电脑、打印机、鼠标、键盘构成的办公系统,音响、功放、麦克风、DVD播放机、电视机等构成的家庭音响和影院系统等。在Java语言和.NET框架中组合概念更加重要。因为对象可以被动态加载,所以解耦设计很重要。例如,如果你发布了一个应用程序,后来由于修复缺陷或者维护的目的,需要重新创建其中一个类文件,那么只需用重新发布这个特定的类文件即可。如果所有的代码都在单个文件中,则需要重新发布整个应用程序。聚合及其实现技术组合最直观的方式就是聚合,聚合意味着一个复杂的对象由许多小对象构成。比如我们每天使用的智能手机,外表看就是一个整体对象,但实际上它是由许多小部件组合而成。简单的讲,聚合往往是一个整体的封装对象,对象内部又可以分解为许多的标准小部件,每个小对象又都是具有特定功能和标准接口的封装体,参考【例3-16】程序。publicclassComputer{//抽象的聚合后的简易计算机privateCPUcpu;//组合子对象cpu处理计算privateMemorymemory;//组合子对象memory处理存储privateKeyboardkeyboard;//组合子对象keyboard处理输入privateScreenscreen;//组合子对象screen处理输出publicComputer(){ memory=newMemory(); cpu=newCPU(memory); keyboard=newKeyboard(); screen=newScreen();} publicComputer(CPUcpu,Memorymemory,Keyboardkeyboard,Screenscreen){ super(); this.cpu=cpu; this.memory=memory; this.keyboard=keyboard; this.screen=screen; }}publicvoiddoWork(){//模拟计算机开机工作方法screen.print("第一个操作数:");memory.setFirstnum(keyboard.inputDouble());screen.print("运算符:");cpu.setInstruct(keyboard.inputString());screen.print("第二个操作数:");memory.setSecondnum(keyboard.inputDouble());cpu.calculate();screen.println("计算结果:"+memory.getResult());}publicclassTestComputer{publicstaticvoidmain(String[]args){ Computermycomputer=newComputer();//创建一个Computer对象 mycomputer.doWork();//执行计算任务}}联合及其实现技术联合代表若干独立的对象可以连接而成一个更复杂和功能更强大的对象。比如在家庭影院系统,电视机、音响、DVD播放机等各种各样的组件都是独立的,都可以提供特定的功能,但我们通过一些插接线连接后构成了一个功能更强大系统。同样的,计算机、打印机、麦克风、音响、摄像头等也都是独立存在的小对象,我们将它们连接在一起就会形成功能更丰富、效率更高的复杂对象。简单理解,联合是将若干独立的子对象连接起来形成具有复杂功能的更大对象,如下面的示例,我们抽象了打印机、摄像头、音箱、麦克风等小对象,通过联合可完成更复杂的功能,参考【例3-17】程序。publicclassTestUnion{publicstaticvoidmain(String[]args){ Computer1mycomputer=newComputer1("联系昭阳450电脑"); Printermyprinter=newPrinter("BrotherDCP-7057打印机"); Cameramycamera=newCamera("奥尼剑影摄像头"); SoundBoxmysound=newSoundBox("好牧人V8音箱"); Microphonemymc=newMicrophone("飞利浦麦克风"); mycomputer.playMusic(mys

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论