第六章面向对象的程序设计概念一、面向对象的基本概念符合人们日常自然的思维习惯;降低、分解问题的难度和复杂性,提高整个求解过程的可控制性、可监视性和可维护性;获得较高效率和较满意效果。面向对象程序设计:对象与类简单地说:对象是表示现实世界中某个具体的事物;类是对对象的抽象描述。张三类(CLASS)如:“manclass”对对象进行抽象为类对类进行实例化面向对象设计思想1、抽象:是从特定的实例中抽取共同的性质以形成一般化概念的过程。对象(object)计算机世界中的对象是把数据及其相关的操作封装在一起所构成的实体。封装的实体=数据+方法(行为)数据:属性或状态方法:作用于数据上的操作封装:属性的访问和变化通过方法完成二、类(class)的概念类:是一种抽象的数据类型,它是所有具有一定共性的对象的抽象。本质上可以认为是对对象的描述,使创建对象的“模板”。类的某一个对象则被称为是类的一个实例,是类的实例化结果。对象类实例化抽象通信的相关性方法1方法2…..方法n对象1方法1方法2…..方法n对象2发送消息接收消息利用通信实现一个对象与另一个对象的信息传递信息传递的三个要素:Ŋ信息接收对象;Ŋ接收对象中哪个方法完成指定动作;Ŋ此方法需要的参数;消息(message)消息对象之间相互请求或相互协作的途径,是要求某个对象执行某项操作的规格说明消息内容通常包含接收对象及请求接收对象完成的功能信息发送对象发出消息,请求接收对象响应接收对象收到消息后,经过解释,激活方法,予以响应方法(method)方法是对象的行为方式(操作)对象与外界的接口作用改变对象的属性返回对象的属性object1object2面向对象方法的主要优点与人类习惯的思维方法一致可重用性性可扩展性可管理性三、定义类[修饰符]class类名[extends父类][implements接口名]{类成员变量声明;类方法声明;}Java实例——定义类classPoint{privateintx,y;publicvoidsetPoint(inta,intb){x=a;y=b;}publicintgetX(){returnx;}publicintgetY(){returny;}publicStringtoString(){return[+x+,+y+];}}四、对象的定义[修饰符]类名对象名=new类名(实参列表);或[修饰符]类名对象名;对象名=new类名(实参列表);创建对象类名对象名;PointthePoint;注意:类属于复合数据类型,因此,在声明对象时,系统并没有为对象分配空间,用户需要应用new完成分配空间的任务。thePoint=newPoint();对象的引用引用成员变量对象名.成员变量名引用方法对象名.方法名(参数列表)Java实例——创建对象续接Java实例-定义类publicclassPointExcise{publicstaticvoidmain(Stringargs[]){PointthePoint=newPoint();thePoint.setPoint(3,5);System.out.println(“坐标x=”+thePoint.getX());System.out.println(“坐标y=”+thePoint.getY());System.out.println(thePoint.toString());}}对象的初始化类中包含有成员变量和方法,当使用类声明并创建对象时,使用new关键字,这时系统为对象创建自己的内存区域并自动调用构造方法初始化成员变量。构造方法构造方法是一个特殊的成员方法,它与类名相同。在创建对象空间后,系统自动根据参数调用相应的构造函数。构造函数的主要功能是为数据成员赋初值。构造方法的特点构造方法名与类名相同;构造方法没有返回类型,也不是void;构造方法的主要作用是对类对象的初始化。如果没有定义构造方法时,各种类型的默认值;构造方法不能由编程人员显式地直接调用;使用不同数量、不同类型的参数对类初始化会拥有多个构造方法;Java实例——定义构造方法classStudent{Stringname;Stringaddress;Stringgrade;Student(Stringx1,Stringx2,Stringx3,inty){//定义构造方法name=x1;address=x2;grade=x3;}publicstaticvoidmain(Stringargs[]){Student1zhang;//声明并创建zhang对象zhang=newStudent1(张三,西安市兴庆路1号,2003级国际贸易3班);Student1wang;//声明并创建wang对象wang=newStudent1(王五,西安市翠华路12号,2003级电子技术3班);System.out.println(zhang.name+zhang.address+zhang.grade);System.out.println(wang.name+wang.address+wang.grade);}}Java实例(续)使用new创建对象时,Java系统自动调用与类同名的构造方法。Java实例——类为方法参数classPosition{privateintX,Y;Position(intx,inty){X=x;Y=y;}publicintgetX(){returnX;}publicintgetY(){returnY;}publicdoubledistance(Positiona,Positionb){//计算两个Position对象a,b两点的距离returnMath.sqrt((a.getX()-b.getX())*(a.getX()-b.getX())+(a.getY()-b.getY())*(a.getY()-b.getY()));//计算距离的公式}Java实例(续)publicstaticvoidmain(Stringargs[]){intx1,x2,y1,y2;doubledis;Positionsource=newPosition(0,0);//创建Position对象sourcePositiontarget=newPosition(5,8);//创建Position对象targetx1=source.getX();y1=source.getY();x2=target.getX();y2=target.getY();System.out.println(第一个点的坐标位置为(+x1+,+y1+));System.out.println(第二个点的坐标位置为(+x2+,+y2+));dis=source.distance(source,target);System.out.println(两个点的距离是:+dis);}}五、类成员变量的定义®定义:[访问权限符][static][final]类型变量名®权限修饰符有:public、protected和private®static:在成员变量前说明该变量是静态变量。®final:在成员变量前说明该变量是一个最终变量修饰符——staticstatic可以修饰类中的属性和方法。静态属性在类定义时静态地分配空间。它属于类,不属于某个特定的对象,因此可以通过类进行访问。往往将属于类的公共属性说明成static。Java实例——static成员变量classStaticTest{publicintx=1;publicstaticinty=1;}publicclassStaticTester{publicstaticvoidmain(Stringargs[]){inti;StaticTest.y=StaticTest.y+1;StaticTestm=newStaticTest();StaticTestn=newStaticTest();m.x=m.x+3;m.y=m.y+3;n.x=n.x+5;n.y=n.y+5;System.out.println(m.x=+m.x++m.y=+m.y);System.out.println(n.x=+n.x++n.y=+n.y);}}Java实例——static方法classSta_method{intwidth,height;publicstaticdoublearea(intwidth,intheight){returnwidth*height;}publicstaticvoidmain(Stringargs[]){inti,j;doublef;i=Integer.parseInt(args[0]);j=Integer.parseInt(args[1]);f=Sta_method.area(i,j);//直接引用此方法System.out.println(Area=+i+*+j+=+f);}}修饰符——final用final声明的类(最终类)不能再有子类;方法(最终方法)不能再被覆盖或重载;成员变量(最终属性)初始化后,不能再被赋值也就是修改成员变量的值(如PI=3.1415926是不能改变的)。Java实例——finalclassFinalCal{privatedoubler;finaldoublePI=3.14159;finaldoublearea(doubler){return(PI*r*r);}publicstaticvoidmain(Stringargs[]){FinalCald=newFinalCal();//定义类对象ddSystem.out.println(“Area=”+d.area(12.3);//引用类中的area()方法}}修饰符——this〠将当前对象的引用变量传递给另一个方法;〠如果方法体内部定义的变量与成员变量名字相同或方法的入口参数与成员变量名相同。如:classTestColor{intr,g,b;TestColor(intr,intg,intb){this.r=r;this.g=g;this.b=b;}}Java实例——thisclassPoint{privateintx,y;publicvoidsetPoint(inta,intb){x=a;y=b;}publicintgetX(){returnx;}publicintgetY(){returny;}publicStringtoString(){return[+this.getX()+,+this.getY()+];}//引用类的方法publicstaticvoidmain(Stringargs[]){inti,j;i=Integer.parseInt(args[0]);j=Integer.parseInt(args[1]);Pointdot=newPoint();dot.setPoint(i,j);System.out.println(dot.toString());}}数学函数类——Math类库格式:类名.数学函数方法名(类型实参1,…,类型实参n)例:publicclassMax{publicstaticvoidmain(Stringargs[]){intx,y;x=Integer.parseInt(args[0]);y=Integer.parseInt(args[1]);System.out.println(最大值是+Math.max(x,y));}}