第三章类、对象和接口陈冬宇chendongyu0125@gmail.com冒泡排序排序是计算机编程中的基本算法,经常会用到。什么叫排序?将任意序列的数据排列成有序序列的数据32421763410139任意序列数据42132343976101升序序列数据10176393432214降序序列数据冒泡排序排序算法有多种,最简单的是冒泡排序。冒泡排序是一种借助交换进行排序的方法。思想是:将第一个数据和第二个数据进行比较,若为升序则如果第一个数据大于第二个数据就交换。若为降序如果第一个数据小于第二个数据就交换32421763410139第一趟升序排序0123456324217634101393242176101343932421101763439324101217634393210142176343910132421763439冒泡排序排序算法有多种,最简单的是冒泡排序。冒泡排序是一种借助交换进行排序的方法。第二趟排序仍然从第一个数据开始,但最后一个数据不参与排序了,因为最后一个数据是已经找出的最大的(降序)或最小的(升序)数据。第二趟升序排序0123456101324217634391013242176393410132421763934101324762139341013276421393410176324213934不参与排序冒泡排序排序算法有多种,最简单的是冒泡排序。冒泡排序是一种借助交换进行排序的方法。第三趟排序仍然从第一个数据开始,但最后两个数据不参与排序了,因为最后两个数据是已经找出的最大的(降序)或最小的(升序)数据。第三趟升序排序012345610176324213934不参与排序10176324213934101763243921341017632394213410176393242134冒泡排序排序算法有多种,最简单的是冒泡排序。冒泡排序是一种借助交换进行排序的方法。第四趟升序排序0123456不参与排序10176393242134101763932434211017639323442110176393432421冒泡排序排序算法有多种,最简单的是冒泡排序。冒泡排序是一种借助交换进行排序的方法。第五趟升序排序0123456不参与排序101763934324211017639343221410176393432214冒泡排序排序算法有多种,最简单的是冒泡排序。冒泡排序是一种借助交换进行排序的方法。第六趟升序排序0123456不参与排序1017639343221410176393432214最终排序结果思考如何用Java程序实现这一算法?第3章类、对象和接口面向过程编程的缺点:代码重用困难面向对象编程:1.面向对象编程更加符合人的思维模式,编写的程序重用性很好。2.面向对象编程有3个特性:封装性继承多态3.2类和对象Example3_1_0.java类是组成Java程序的基本要素。类封装了一类对象的属性和方法。类的实现包括两部分:类声明和类体。class类名{类体的内容}类名的命名规则:类名使用英文单词或拼音;名字的首字母大写;当类名由几个单词复合而成,每个单词的首字母用大写。3.2类和对象类体:类体的内容由两部分构成:一部分是变量的定义,用来刻画属性;另一部分是方法的定义,用来刻画功能。例子:写一个关于“梯形”的类classTrapezia{floatup,low,height,laderArea;//变量定义部分floatcalculateArea()//方法定义{laderArea=(up+low)*height/2.0f;returnladerArea;}voidsetParam(floatu,floatl,floath){up=u;low=l;height=h;}}定义了类后,可以被别的类使用。比如Example3_1_1.javapublicclassExample3_1_1{publicstaticvoidmain(String[]args){Trapeziat=newTrapezia();t.setParam(34,56,10);System.out.println(面积是:+t.calculateArea());}}3.成员变量和局部变量我们已经知道类体分为两部分。变量定义部分所定义的变量被称为类的成员变量。在方法体中定义的变量和方法的参数被称为局部变量。classPeople{intboy;floata[];voidf(){booleancool;WorkmanzhangBoy}}classWorkman{doublex;}3.成员变量和局部变量Example3_1_2.java成员变量与局部变量的作用范围:成员变量在整个类内都有效,局部变量只在定义它的方法内有效。成员变量与它在类体中书写的先后位置无关,但我们建议成员变量的定义都放在类体的前面,然后再定义方法。classPeople{floata[];voidf(){booleancool;WorkmanzhangBoy}intboy;}classWorkman{doublex;}3.成员变量和局部变量Example3_1_3.java成员变量又分为实例成员变量(简称实例变量)和类变量(也称静态变量)。如果成员变量的类型前面加上关键字static,这样的成员变量称做是类变量或静态变量。classPeople{floata[];staticintboy;voidf(){booleancool;WorkmanzhangBoy;}}classWorkman{doublex;}3.成员变量和局部变量Example3_1_4.java如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效。classPeople{floata[];intboy=2;voidf(){intboy;boy++;}}会提示错误3.成员变量和局部变量如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏。这时如果想在该方法内使用成员变量,必须使用关键字this。classPeople{floata[];intboy=2;voidf(){intboy;this.boy++;}}4.方法我们已经知道一个类的类体由两部分组成:变量的定义和方法的定义。方法的定义包括两部分:方法声明和方法体。最基本的方法声明包括:方法返回的数据类型,方法名和方法类型,以及参数。方法类型方法名(定义参数){方法体}intsum(inta,intb){returna+b;}4.方法如果方法只是完成一些功能,不需要返回数据,则方法的类型是void型。如果方法需要返回数据类型,则需要规定方法的类型classExample{intsum(inta,intb){returna+b;}voidprint(){System.out.println(sum(2,3));}}4.方法方法的声明中可以给出方法的参数,也可以不给出classExample{intsum(inta,intb){returna+b;}voidprint(){System.out.println(sum(2,3));}}4.方法方法体中可以包含局部变量定义和合法的Java语句intmax(inta,intb){intc;if(ab)c=a;elsec=b;returnc;}4.方法return语句从方法中返回值intsum(inta,intb){returna+b;}intmax(inta,intb){returnab?a:b;}4.方法对于void类型方法可以不写return语句,也可以写voidprint(inta,intb){System.out.println(a+b);}voidprint(inta,intb){if(ab)return;System.out.println(a+b);}4.方法方法的调用:写方法的目的是把一定的程序功能集中到一个模块(方法)中来完成。即,一个方法完成一定的功能。这个功能可以供其他程序来使用。其他程序的使用是通过方法调用的方式来完成。方法调用代码需要按照被调用方法的定义给出方法名和相应的参数。ClassA{publicstaticvoidmain(String[]args){intb=sum(2,3);}intsum(inta,intb){returna+b;}}4.方法Example3_1_4.java方法参数也是定义的变量,这个变量的赋值,是在方法被调用时完成的,该变量在整个方法内有效。方法内定义的局部变量从它定义的位置之后开始有效。voidprint(){int[]a={1,2,3};System.out.print(sum(a));}intsum(int[]a){for(inti=0;ia.length;i++){val+=a[i];}intval;returnval;}4.方法如果局部变量的定义是在一个复合语句中,那么该局部变量的有效范围是该复合语句,即仅在该复合语句中有效intsum(int[]a){if(a.length0){intval=0;for(inti=0;ia.length;i++){val+=a[i];}}returnval;}4.方法如果局部变量的定义是在一个循环语句中,那么该局部变量的有效范围是该循环语句,即仅在该循环语句中有效.Inta[]={1,2,3,4};Intb[]={4,5,6,7};for(inti=0;ia.length;i++){System.out.println(a[i])}for(inti=0;ib.length;j++){System.out.println(b[i]);}Example3_1_5.java思考:下面是一个不完整的类,请补写缺失的方法average,使得程序可以正常运行。average求数组的平均值。publicclassexample{publicstaticvoidmain(){int[]a={1,2,3,4};doubleval=average(a);System.out.println(val);}}4.方法方法重载:方法重载的意思是:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同。或者是参数的个数不同,或者是参数的类型不同。classArea{floatgetArea(floatr){return3.14f*r*r;}doublegetArea(floatx,inty){returnx*y;}floatgetArea(intx,floaty){returnx*y;}doublegetArea(floatx,floaty,floatz){return(x*x+y*y+z*z)*2.0;}}classArea{publicvoidmain(){doubledia=5;floata=1.0f,b=4.5f;intx=10,y=23;System.out.println(getArea(dia));System.out.println(getArea(a,b));System.out.println(getArea(x,y));}}构造方法:后面再讲暂时不考虑该例子思考:有个Square类(长方形),它有长和宽的属性;有三个功能:周长计算,面积计算,判断是正方形或长方形。写出这个类7.类方法和实例方法类中的方法也可分为实例方法和类方法.方法声明时,方法类型前面不加关键字static的是实例方法、加关键字static的是类方法。构造方法是特殊的方法,不能用static修饰构造方法。8.值得注意的问题(1)对成员变量的操作只能放在方法中,方法可以对成员变量和方法体中自己定义的局部变量进行操作。在定义类的成员变量时可以同时赋值。publicclassexample{inta=2;a=a+4;publicstaticvoidmain(){a=a+4}}类体中,直接包