Java程序设计系列讲座-2

上传人:平*** 文档编号:52571729 上传时间:2018-08-23 格式:PPT 页数:86 大小:1.57MB
返回 下载 相关 举报
Java程序设计系列讲座-2_第1页
第1页 / 共86页
Java程序设计系列讲座-2_第2页
第2页 / 共86页
Java程序设计系列讲座-2_第3页
第3页 / 共86页
Java程序设计系列讲座-2_第4页
第4页 / 共86页
Java程序设计系列讲座-2_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《Java程序设计系列讲座-2》由会员分享,可在线阅读,更多相关《Java程序设计系列讲座-2(86页珍藏版)》请在金锄头文库上搜索。

1、Java程序设计系列讲座2 OOP之封装性,黄绍辉 厦门大学计算机科学系 E-mail: ,面向对象程序设计基本思想,对象的基本概念 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。 对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。 客观世界是由对象和 对象之间的联系组成。,类的基本概念,类是具有相同属性和服务的一组对象的集合。分类的原则是抽象。 在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明

2、和服务说明两个主要部分。 类与对象的关系 就如模具和铸件 的关系,类的实 例化结果就是对 象,而对一类对 象的抽象就是类。,关于OOPObject Oriented Programming,对象是基本编程单位。与此对应,Java使用类(class)表示对象,一个class就是一个类; 对象由一组属性和一组服务两部分组成(两部分不必都存在)。与此对应,Java使用一组成员变量(member variable)表示属性,一组成员函数(member method)表示服务。,OOP的例子,例如我们要表示一个遥控器对象,它起码有两个属性:外壳,按钮。它起码有两个功能:换台,调音量。使用Java来设计这

3、个对象,它看起来就是这个样子: class 遥控器 外壳成员按钮成员换台函数()调音量函数() ,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(“Tim

5、e1 is %d:%d:%d”,hour1,minute1,second1); 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/

6、minute/second的下标弄混了怎么办?,解决方案,问题1只能通过动态分配内存解决,使用静态分配是不能彻底解决问题的。 问题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); 注意这

7、里其实struct MyTime已经可以算是一个对象了,因为它拥有自己的成员;所以每一个这种结构的变量,例如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

8、.second); ,public class Main public static void main(String args),class MyTime int hour; int minute; int second; ,MyTime time1=new MyTime();,System.out.print(“Time is “ + time1.hour+”:”+time1.minute+”:”+time1.second);,新的任务,现在要添加一个函数用来处理时间,我们希望调用这个函数后,能够得到一个新的时间,如: AddOneHour;/小时数加1 为了实现上述的函数,C中可以选择的

9、设计方案有2个: 生成新时间对象,然后覆盖到旧对象上,此时需要函数能够返回新对象: struct MyTime AddOneHour(struct 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 +

10、; ,使用示例: struct MyTime t; t = AddOneHour(t);,使用示例: struct MyTime t; AddOneHour(,关于上面两个函数的探讨,前面说过,struct MyTime已经可以看成是对象了,从上面的两个函数可以看出,为了修改对象的属性,比较好的作法,是(通过指针)直接修改对象本身的属性,代码简单,效率也高。 但是C毕竟是面向过程的语言,实现 “对象的加工”或者叫“对象的服务”,需要借助struct MyTime之外的函数AddOneHour完成。 OOP语言的第一个方便之处,就是把属性和服务整合到同一个对象中,这给编程带来了极大的方便,例如:

11、,Java版本的AddOneHour,class MyTime int hour; int minute; int second; void AddOneHour() hour+; ,使用示例: MyTime t=new MyTime(); t.AddOneHour();,把属性和服务整合到同一个对象内部的最大好处,是你不再需要将一个结构作为一个参数传入到外部的处理函数,也不需要考虑将处理后的结果从函数传出,甚至贴代码的时候,都不用担心会少贴一个函数,看出封装的好处了吗?,C的结构可以存储数据,但是不能包含函数,因此必须在其它的地方定义函数。这个做法可能导致以下后果: 调用不方便,参数要传入传

12、出毕竟是比较麻烦的 可能和别人写的函数产生冲突(例如重名) 代码的重用和修改不方便 Java可以将数据和处理函数一起封装,因此数据以及对数据的加工都可以在同一个对象当中完成。,总结一下封装性,OOP中,对象就是对一组变量和相关方法的封装,其中变量表明了对象的状态,方法表明了对象具有的行为。 简单一点说,封装性指的是:属性和函数都放在同一个对象的内部。 对Java而言就是:一个class可以内部可以有多个成员变量和多个成员函数;成员函数可以直接访问成员变量,并对其进行修改。 通过对象的封装,实现了模块化和信息隐藏。,跑步进入OOP有个例子,从简单对象入手,对象不是很深奥的东西,一个对象在Java

13、里面就是一个class而已。例如随便写一个对象: class Point /首字母大写是Java建议的对象命名规则int x,y; 这个Point对象可以用来表示平面上的一个点。注意Java并不要求对象一定要有成员函数,所以这个对象已经很完整,只是还不够好用而已,接下来我们会逐步完善它。,对象的用法,要使用一个已有的对象不是太难,但是你要做足以下的两件事情: 使用对象的名字声明一个变量 创建对象的一个实例 用上面的Point做例子,就是这样: 使用对象的名字声明一个变量 Point p; 创建对象的一个实例 p = new Point(); 接下来这个p就拥有了Point的全部资源,例如它有两

14、个成员变量,叫x,y,而且还是整型的。,对象的用法,对象的声明和创建可以合成一步: Point p = new Point(); 当然也可以隔了很多步: Point p; /* 中间有很多很多很多行,但是和p无关 */ p = new Point(); 只有一个准则:对象在创建之前是不能使用的,所以new很重要。,对象与实例,前面说到,对象必须创建才能使用,所以你必须这样创建p:Point p = new Point(); 这里引入几个术语:Point 是类名,也是对象名,或者干脆叫对象p 是对象的实例,也就是Point的实例 你可以理解对象是一个图章,它每盖章一次(new一次)生成一个p,p

15、就是一个实例。,一个完整例子:Test.java,class Point int x,y; public class Test public static void main(String args) Point p = new Point();System.out.println(“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以后才能使用 下面我们来用这两招对付Ja

16、va的一个常用对象:数组。 和C语言不同,Java把数组设计成了对象,所以根据我们的招式二,Java的数组必须先new才能使用。如果你能够意识到这一点,那么恭喜你,OOP入门成功,数组入门1,1 声明一个数组 dataType arrayRefVar; 或 dataType arrayRefVar; 例如:double myList; 2 创建一个数组 arrayRefVar = new dataTypearraySize; 如:myList = new double10;,数组入门2,声明并创建一个数组 dataType arrayRefVar = new dataTypearraySize; 或 dataType arrayRefVar = new dataTypearraySize; 例如:double myList = new double10;,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号