第三讲面向对象程序设计方案思想——类和封装_第1页
第三讲面向对象程序设计方案思想——类和封装_第2页
第三讲面向对象程序设计方案思想——类和封装_第3页
第三讲面向对象程序设计方案思想——类和封装_第4页
第三讲面向对象程序设计方案思想——类和封装_第5页
已阅读5页,还剩6页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、第三章 面向对象程序设计思想 1)类和封装3.1 面向对象设计方法的由来1)提高软件的可维护性和可复用性 如何同时提高软件的可维护性和可复用性是现代软件工程的核心问题 一个好的软件设计,必须能够允许新的设计要求以较为容易和平和的方式加 入到已有的系统中去,从而使这个系统能够不断的焕发青春。 复用的重要性:提高生产效率、提高软件质量、改善软件可维护性 传统的复用方法:代码粘贴、算法复用、数据结构复用2)问题抽象的进步所有编程语言都是对目标问题的“抽象”。 汇编语言用机器的思维去考虑问题,是面向机器的抽象 高级语言以接近自然语言的思维去考虑问题,是面向问题的抽象 面向对象语言以自然界“物质”的思维

2、去考虑问题,认为程序是由一堆对象 相互作用的结果3)机器性能的提高 思维的抽象越来越接近自然,也就意味着要用越来越多的“额外”代码来做 支撑。软件执行速度和复用型、可维护性常常是一对矛盾3.2 “纯粹”的面向对象程序设计方法是什么样的1)所有东西都是对象可将对象想象成一种新的类型;同一类的对象具有相同的属性名称和方法;2)程序是一堆对象相互作用的结果。它们通过相互发送消息来彼此作用 为了告诉对象做什么,需向那个对象“发送一条消息”。具体地讲,可将消息想象 为一个调用,它调用的是从属于目标对象的一个子例程或函数。3)每个对象是独立的,也就是拥有独立的存储空间4)每个对象都有一种类型5)同一类型的

3、各个对象,它们能接收的消息是相同的6)程序通过引用访问对象3.3对象和类3.3.1 类人们对事物的抽象描述,概括出该事物所具有的属性和方法,并将其进行封装,以供 使用。用class定义类,声明类的形式为:附加声明访问修饰符class类名称extends 基类属性方法例3.1每位学生每学期最多有15门课程,课程有考试课和考查课两种。课程成绩的原始分按正常考试/考查实际得分计算。考试课的原始分使用百分制形式,考查课的原始分采用等第 形式优秀、良好、中等、及格、不及格)。在进行测评成绩计算时,考查课程成绩中的 优秀、良好、中等、及格、不及格的,分别换算成为95、85、75、65和50分。测评计算公式

4、为:mE (草科成缢X学分)分析:从上面描述中可以得到以下有效关键字:学生、课程、考试课、考查课、原始分、评 测成绩、学分因此,得到下面几个类:学生类、课程类、考试课类、考查课类。学生类+姓名:string+学号:string+课程列表+添加课程()+计算评测成绩():double考试课类+课程名:stri ng+学分:double+原始分:double考查课类+课程名:string+学分:double+原始分:string+转换成绩():double进一步考虑,我们可以发现,考试课类和考查课类都是课程类的子类型。这种现象在面向对象的设计中称为继承,在UML的类图中使用空心三角的箭头 )表示继

5、 承,箭头指向父类。我们可以把相同的东西合并到父类里。学生类课程类+课程名:string+学分:double+原始分:string+转换成绩():double+姓名 : string+学号:string+课程列表+添加课程()+计算评测成绩():doubleString类型 字符串),具体的实现后面注意,为了 “统一”起见,我们将考试课的原始分也定义为了 这样,考试课的“转换成绩”要做的事是将字符串的数值还原成百分制 会讲到),而考查课的“转换成绩”要做的事是将等第进行转换。于是,我们就可以写出这四个类的结构:1 )学生类class学生类public Stri ng 姓名。public Str

6、ing 学号。public课程类课程列表。public void添加课程(课程类课程/将课程添加到课程列表中public double计算评测成绩(return 0.0。说明:public关键字是用来设定访问权限的,表示任何程序都能够访问。与它相对应还 有 protected保护)、private 私有);课程列表我们使用了数组。关于数组,我们要过一段时间再介绍。2)课程类class课程类public Stri ng 课程名。public Stri ng 原始分。public double 学分。public double 转换成绩(return 0.0。/将数值型的字符串转换为百分制retu

7、rn 0.0说明:extends关键字表示继承,这说明考试课类是课程类的子类,它继承考试类中的内 容。/将等第转换为百分制return 0.0。3.3.2对象对象 实例):类的实例化。客观的。对象在建立时分配了内存,创建对象实际上作了两个方面的工作:1)使用new关键字分配内存;2)使用构造函数初始化数据 。3.3.3使用对象1、不直接使用对象,而是使用“引用”“引用”指该类型的变量并不直接存储所包含的实际数据,而是存储实际数据的地 址。2、引用间赋值时传递的是存放对象的地址3、当一个对象不被任何句柄引用时,视作“垃圾”。由JAVA的垃圾回收机制自动销毁不再使用的对象。垃圾回收机制是在它认为适

8、当的时候自动回收不再使用的内存的。class测试学生类Ipublic static void main( Stri ng args学生类 st=new 学生类(。st姓名=张三。 st学号=200。System.out.println(st.姓名 +的学号为+ st.学号 。输出:张三的学号为2003.4 JAVA中的常用类JAVA中的数据类型分为“基本类型”和“引用类型”两种。基本类型存放在栈内存 中,对象存放在堆内存中,而引用存放在栈内存中,并指向对象。使用class定义的类型称为引用类型,在使用引用类型时,不是直接使用对象,而是通 过“引用”访问对象。就像使用遥控器访问电视机。3.4.1

9、字符串类型 StringJava将字符串作为String类型对象来处理。有些出乎意料的是当创建一个Stri ng对象时,被创建的字符串是不能被改变的。这也就是说一旦一个 Stri ng对象被创建,将无法改变那些组成字符串的字符。表面上看起来, 这好像是一个严格的约束。然而事实并非如此。你仍能够执行各种类型的字符串操作。区 别在于每次需要改变字符串时都要创建一个新的Stri ng对象来保存新的内容。原始的字符串不变。之所以采用这种方法是因为实现固定的,不可变的字符串比实现可变的字符串更高效。对于那些想得到改变的字符串的情况,有一个叫做StringBufer的String类的友类。它的对象包含了在

10、创建之后可被改变的字符串。String 类和 StringBufer 类都在 java.lang 中定义。le ngth( 方法可以得到字符串的长度charAt(int index 方法可以从一个字符串中截取一个字符 toCharArray( 方法可以将字符串中的字符转换为一个字符数组 equals( 方法可以比较两个字符串是否相等 indexOf(String str 搜索字符或子字符串首次出现的位置 lastIndexOf(String str 搜索字符或子字符串的最后一次出现的位置substring( 方法可以截取子字符串,它有两种形式。其中第一种形式如下:Stringsubstring

11、(int startIndex 这里 startIndex 指定了子字符串开始的下标。这种形式返回 一个从 startIndex 开始到调用字符串结束的子字符串的拷贝。第二种形式允许指定 子字符串的开始和结束下标: String substring(int startIndex, int endIndex 这里 startIndex 指定开始下标, endIndex 指定结束下标。返回的字符串包括从开始下标 直到结束下标的所有字符,但不包括结束下标对应的字符。replace( 方法用另一个字符代替调用字符串中一个字符的所有具体值:String s =Hello.replace(l, w 。 将

12、字符串“ Hewwo ”赋给 s。trim( 方法去除字符串首尾空格3.4.2 数值封装类在 java.lang 中定义了与基本类型相对应的类类型:双精度型 Double ),浮点型Float),字节型 Byte),短整型 Short),整型 1 nteger )和长整型 , parseShort( , parselnt( , parseLong( , parseFloat(禾口 parseDouble( 方法。这些 方法返回与调用它们的数值字符串相应的字节byte),短整型sho rt),整型int),长整型和双精度(double值。如果转换失败,将产生 NumberFormatExcept

13、ion 异常例 3.2str = 1”23”。try int i = lnteger.parselnt(str 。catch(NumberFormatException e System.out.println(lnvalid format 。i = 0。lnteger 和 Long 类 还 同 时 提 供 了 toBinaryString( , toHexString( 和 toOctalString( 方法,可以分别将一个值转换成二进制,十六进制和八进制字符 串。例 3.3int num = 19648 。System.out.println(num + in binary: +lnteg

14、er.toBinaryString(num 。 System.out.println(num + in octal: +lnteger.toOctalString(num 。 System.out.println(num + in hexadecimal: +lnteger.toHexString(num 。 输出:19648 in binary: 10011001100000019648 in octal: 4630019648 in hexadecimal: 4ccO要将基本类型转换为字符串类型,可以调用相应类 方法。例3.4int i=1111。double d=3.25。String

15、s=ln teger.toStri ng(i+Double.toStri ng(d 。System.out.println(s。到这里,我们应该可以写出考试课类的转换成绩( 方法了:例3.5public double 转换成绩(trydouble result=Double.parseDouble(this.原始分 。return result。catch(NumberFormatExceptio n ereturn -1。我们在主程序中输入以下代码进行测试:考试课类ks=new考试课类(。ks.原始分=96。System.out.println(ks.转换成绩(。输出:96.03.4.3Ma

16、th 类Math类中基本成员的功能名称功能说明E自然对数的底数2.718281827 PI圆周率3.1415926 sqrt(x计算x的平方根abs(x计算x的绝对值sin(x计算x的正弦值cos(x计算x的余弦值tan (x计算x的正切制log(x计算log ex的值,即lnxlog10(x计算log個的值exp(x计算expow(x,y计算xycbrt(x计算x的立方根ran dom(在0,10上随机提取一个整数3.5封装如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象 一个人的身高,不能被外部随意修改,只能通过各种方法去修改这个属性。在定义一个类的成员 包括变量

17、和方法)时,使用 private关键字说明这个成员的访问 权限,这个成员成了类的私有成员,只能被这个类的其他成员方法调用,而不能被其他的 类中的方法所调用。为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义 两个方法来实现这两种操作,一个是getXxx(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx(用来对这个成员变量赋值。Private 员默认的成员Protected 员Public 员同啖中可见杲址同亍包中对子炎可见址是同一牛包中对菲子类

18、可见足不同包中对类可见不同的包中刈非r娄可见现在,我们就用封装的思想来改进我们的课程类:例3.6class课程类private Stri ng 课程名。private Stri ng 原始分。private double 学分。public void set 课程名(String 课程名 this.课程名=课程名。public String get 课程名(return this.课程名。public void set 原始分(String 原始分 this 原始分=原始分。public String get 原始分(return this.原始分。public void set 学分 (double 学分 this 学分=学分。public double get 学分 (return this. 学分。public double 转换成绩 (return 0.0。3.6 上机练习1、把讲义中黄色底纹的代码在工具中进行测试。先建立课程类,然后学生类,考试课 类,考查课类,最后进行测试学生类的运行,观察结果。2

温馨提示

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

评论

0/150

提交评论