Java程序设计系列讲座.ppt
《Java程序设计系列讲座.ppt》由会员分享,可在线阅读,更多相关《Java程序设计系列讲座.ppt(86页珍藏版)》请在三一办公上搜索。
1、Java程序设计系列讲座2OOP之封装性,黄绍辉厦门大学计算机科学系E-mail:,面向对象程序设计基本思想,对象的基本概念对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成。,类的基本概念,类是具有相同属性和服务的一组对象的集合。分类的原则是抽象。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要
2、部分。类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。,关于OOPObject Oriented Programming,对象是基本编程单位。与此对应,Java使用类(class)表示对象,一个class就是一个类;对象由一组属性和一组服务两部分组成(两部分不必都存在)。与此对应,Java使用一组成员变量(member variable)表示属性,一组成员函数(member method)表示服务。,OOP的例子,例如我们要表示一个遥控器对象,它起码有两个属性:外壳,按钮。它起码有两个功能:换台,调音量。使用Java来设计这个对象,它看起来就是这个样子:c
3、lass 遥控器 外壳成员 按钮成员 换台函数()调音量函数(),OOP的基本特征,封装性把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节。继承性从一个已有的类来构造新类,除了保留原有的类的特性,还增加了一些新特性。已有的类称为父类superclass,新类称为子类subclass。多态性在父类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。,OOP-Part I 封装性,从C语言开始出发,任务:在程序中实现对时间的一些操作思路:时间是一个整体,包括时/分/秒,为了在程序中表示一个具体的时间,这三个部份缺一不可。最自然的,可以采用三个整型变量
4、来存储这三个部份,例如:int hour;int minute;int second;,C程序示例,void main()int hour,minute,second;hour=12;minute=12;second=12;printf(“Time is%d:%d:%d”,hour,minute,second);,如果有很多个时间,void main()int hour1,minute1,second1;int hour2,minute2,second2;int hour3,minute3,second3;printf(“Time1 is%d:%d:%d”,hour1,minute1,seco
5、nd1);printf(“Time2 is%d:%d:%d”,hour2,minute2,second2);printf(“Time3 is%d:%d:%d”,hour3,minute3,second3);,如果用数组,void main()int hour100,minute100,second100;for(int i=0;i100;i+)printf(“Time%d is%d:%d:%d”,(i+1),houri,minutei,secondi);问题1:万一数组不够大怎么办?问题2:如果hour/minute/second的下标弄混了怎么办?,解决方案,问题1只能通过动态分配内存解决,
6、使用静态分配是不能彻底解决问题的。问题2的解决可以求助于结构,这样就可以将三个量作为一个整体来处理。struct MyTime int hour;int minute;int second;,C语言的增强版,void main()struct MyTime time1;time1.hour=12;time1.minute=12;time1.second=12;printf(“Time is%d:%d:%d”,time1.hour,time1.minute,time1.second);注意这里其实struct MyTime已经可以算是一个对象了,因为它拥有自己的成员;所以每一个这种结构的变量,例
7、如time1,都是这个对象的实例;如果还有一个time2,那么time1和time2的成员是互不相关的。,强行改造成Java程序,struct MyTime int hour;int minute;int second;void main()struct MyTime time1;time1.hour=12;time1.minute=12;time1.second=12;printf(“Time is%d:%d:%d”,time1.hour,time1.minute,time1.second);,public class Main public static void main(String
8、args),class MyTimeint hour;int minute;int second;,MyTime time1=new MyTime();,System.out.print(“Time is“+time1.hour+”:”+time1.minute+”:”+time1.second);,新的任务,现在要添加一个函数用来处理时间,我们希望调用这个函数后,能够得到一个新的时间,如:AddOneHour;/小时数加1为了实现上述的函数,C中可以选择的设计方案有2个:生成新时间对象,然后覆盖到旧对象上,此时需要函数能够返回新对象:struct MyTime AddOneHour(stru
9、ct Mytime t)在旧对象上修改,此时需要将旧对象的指针传入,但是不再需要返回值:void AddOneHour(struct Mytime*t),C语言版本的AddOneHour,struct MyTime AddOneHour(struct Mytime t)struct MyTime temp=t;temp.hour+;return temp;void AddOneHour(struct Mytime*t)t-hour+;,使用示例:struct MyTime t;t=AddOneHour(t);,使用示例:struct MyTime t;AddOneHour(,关于上面两个函数的
10、探讨,前面说过,struct MyTime已经可以看成是对象了,从上面的两个函数可以看出,为了修改对象的属性,比较好的作法,是(通过指针)直接修改对象本身的属性,代码简单,效率也高。但是C毕竟是面向过程的语言,实现“对象的加工”或者叫“对象的服务”,需要借助struct MyTime之外的函数AddOneHour完成。OOP语言的第一个方便之处,就是把属性和服务整合到同一个对象中,这给编程带来了极大的方便,例如:,Java版本的AddOneHour,class MyTimeint hour;int minute;int second;void AddOneHour()hour+;,使用示例:M
11、yTime t=new MyTime();t.AddOneHour();,把属性和服务整合到同一个对象内部的最大好处,是你不再需要将一个结构作为一个参数传入到外部的处理函数,也不需要考虑将处理后的结果从函数传出,甚至贴代码的时候,都不用担心会少贴一个函数,看出封装的好处了吗?,C的结构可以存储数据,但是不能包含函数,因此必须在其它的地方定义函数。这个做法可能导致以下后果:调用不方便,参数要传入传出毕竟是比较麻烦的可能和别人写的函数产生冲突(例如重名)代码的重用和修改不方便Java可以将数据和处理函数一起封装,因此数据以及对数据的加工都可以在同一个对象当中完成。,总结一下封装性,OOP中,对象就
12、是对一组变量和相关方法的封装,其中变量表明了对象的状态,方法表明了对象具有的行为。简单一点说,封装性指的是:属性和函数都放在同一个对象的内部。对Java而言就是:一个class可以内部可以有多个成员变量和多个成员函数;成员函数可以直接访问成员变量,并对其进行修改。通过对象的封装,实现了模块化和信息隐藏。,跑步进入OOP有个例子,从简单对象入手,对象不是很深奥的东西,一个对象在Java里面就是一个class而已。例如随便写一个对象:class Point/首字母大写是Java建议的对象命名规则 int x,y;这个Point对象可以用来表示平面上的一个点。注意Java并不要求对象一定要有成员函数
13、,所以这个对象已经很完整,只是还不够好用而已,接下来我们会逐步完善它。,对象的用法,要使用一个已有的对象不是太难,但是你要做足以下的两件事情:使用对象的名字声明一个变量创建对象的一个实例用上面的Point做例子,就是这样:使用对象的名字声明一个变量 Point p;创建对象的一个实例 p=new Point();接下来这个p就拥有了Point的全部资源,例如它有两个成员变量,叫x,y,而且还是整型的。,对象的用法,对象的声明和创建可以合成一步:Point p=new Point();当然也可以隔了很多步:Point p;/*中间有很多很多很多行,但是和p无关*/p=new Point();只有
14、一个准则:对象在创建之前是不能使用的,所以new很重要。,对象与实例,前面说到,对象必须创建才能使用,所以你必须这样创建p:Point p=new Point();这里引入几个术语:Point 是类名,也是对象名,或者干脆叫对象 p 是对象的实例,也就是Point的实例你可以理解对象是一个图章,它每盖章一次(new一次)生成一个p,p就是一个实例。,一个完整例子:Test.java,class Point int x,y;public class Test public static void main(String args)Point p=new Point();System.out.pr
15、intln(“p.x=”+p.x+“p.y=”+p.y);p.x=1;p.y=2;System.out.println(“p.x=”+p.x+“p.y=”+p.y);,插播一下:数组,使用对象,我们刚刚学会两招:招式一:对象可以同时拥有属性和函数;招式二:对象要new以后才能使用下面我们来用这两招对付Java的一个常用对象:数组。和C语言不同,Java把数组设计成了对象,所以根据我们的招式二,Java的数组必须先new才能使用。如果你能够意识到这一点,那么恭喜你,OOP入门成功,数组入门1,1 声明一个数组dataType arrayRefVar;或 dataType arrayRefVar;
16、例如:double myList;2 创建一个数组arrayRefVar=new dataTypearraySize;如:myList=new double10;,数组入门2,声明并创建一个数组dataType arrayRefVar=new dataTypearraySize;或 dataType arrayRefVar=new dataTypearraySize;例如:double myList=new double10;,数组入门3,数组在创建之后,Java会为这个数组自动分配空间。(注意声明数组的时候并没有分配数组元素空间,因为那时候不知道数组多大),数组入门4,任何一个数组,都可以通
17、过属性length得到数组的长度。如:myList.length数组创建的时候会自动赋零值,对于数值型的,就是0或者0.0或者0,对于布尔型的,就是false任何一个数组,其元素的最小下标是0,最大下标是length-1数组下标越界会引发异常,数组入门5,数组元素的引用使用,以下两个方法可以打印出数组myList的每一个元素值:for(int i=0;i myList.length;i+)System.out.print(+myListi);或者(JDK1.5以上版本才支持的)for(int val:myList)System.out.print(+val);,数组入门6,数组在创建的时候可以
18、顺便初始化,如:double myList=1.9,2.9,3.4,3.5;它相当于:double myList=new double4;myList0=1.9;myList1=2.9;myList2=3.4;myList3=3.5;,数组例程1/3,用100以内随机数初始化数组for(int i=0;i myList.length;i+)myListi=Math.random()*100;,数组例程2/3,数组求和double total=0;for(int i=0;i myList.length;i+)total+=myListi;,数组例程3/3,求数组中的最大值double max=m
19、yList0;for(int i=1;i max)max=myListi;,数组作为函数参数1,数组作为参数,Java采用的是引用传递方式,基本数据类型(int,char等)作为参数,采用值传递方式。简单一点说,引用传递方式,实际参数和形式参数,操作的其实是同一个对象;值传递方式,实际参数和形式参数,操作的是不同对象,仅仅是这两个对象的值相等而已。,数组作为函数参数2,public class Test public static void main(String args)int x=1;/x represents an int value int y=new int10;/y repres
20、ents an array of int values m(x,y);/Invoke m with arguments x and y System.out.println(x is+x);/x值不变,还是1 System.out.println(y0 is+y0);/y0值已改变,本来是0的 public static void m(int number,int numbers)number=1001;/Assign a new value to number numbers0=5555;/Assign a new value to numbers0,数组作为函数参数3,1 public c
21、lass TestPassArray 2/*Main method*/3 public static void main(String args)4 int a=1,2;5 6/Swap elements using the swap method 7 System.out.println(Before invoking swap);8 System.out.println(array is+a0+,+a1+);9 swap(a0,a1);/值传递,返回后不改变原值10 System.out.println(After invoking swap);11 System.out.println(
22、array is+a0+,+a1+);1213/Swap elements using the swapFirstTwoInArray method14 System.out.println(Before invoking swapFirstTwoInArray);15 System.out.println(array is+a0+,+a1+);16 swapFirstTwoInArray(a);/引用传递,返回后原值可能改变17 System.out.println(After invoking swapFirstTwoInArray);18 System.out.println(array
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 程序设计 系列 讲座
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6510033.html