《2022年第三讲面向对象程序设计方案思想——类和封装》由会员分享,可在线阅读,更多相关《2022年第三讲面向对象程序设计方案思想——类和封装(10页珍藏版)》请在金锄头文库上搜索。
1、1 / 10 第三章 面向对象程序设计思想1)类和封装3.1 面向对象设计方法的由来1)提高软件的可维护性和可复用性如何同时提高软件的可维护性和可复用性是现代软件工程的核心问题一个好的软件设计,必须能够允许新的设计要求以较为容易和平和的方式加入到已有的系统中去,从而使这个系统能够不断的焕发青春。复用的重要性:提高生产效率、提高软件质量、改善软件可维护性传统的复用方法:代码粘贴、算法复用、数据结构复用2)问题抽象的进步所有编程语言都是对目标问题的“抽象”。汇编语言用机器的思维去考虑问题,是面向机器的抽象高级语言以接近自然语言的思维去考虑问题,是面向问题的抽象面向对象语言以自然界“物质”的思维去考
2、虑问题,认为程序是由一堆对象相互作用的结果3)机器性能的提高思维的抽象越来越接近自然,也就意味着要用越来越多的“额外”代码来做支撑。软件执行速度和复用型、可维护性常常是一对矛盾3.2“纯粹”的面向对象程序设计方法是什么样的1)所有东西都是对象可将对象想象成一种新的类型;同一类的对象具有相同的属性名称和方法;2)程序是一堆对象相互作用的结果。它们通过相互发送消息来彼此作用为了告诉对象做什么,需向那个对象“发送一条消息”。具体地讲,可将消息想象为一个调用,它调用的是从属于目标对象的一个子例程或函数。3)每个对象是独立的,也就是拥有独立的存储空间4)每个对象都有一种类型5)同一类型的各个对象,它们能
3、接收的消息是相同的6)程序通过引用访问对象精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 10 页2 / 10 3.3 对象和类3.3.1 类人们对事物的抽象描述,概括出该事物所具有的属性和方法,并将其进行封装,以供使用。用 class定义类,声明类的形式为:附加声明 访问修饰符 class 类名称 extends 基类 属性 方法 例 3.1 每位学生每学期最多有15 门课程,课程有考试课和考查课两种。课程成绩的原始分按正常考试 /考查实际得分计算。考试课的原始分使用百分制形式,考查课的原始分采用等第形式 优秀、良好、中等、及格、不及
4、格)。在进行测评成绩计算时,考查课程成绩中的优秀、良好、中等、及格、不及格的,分别换算成为95、 85、75、65 和 50 分。测评计算公式为:分析:从上面描述中可以得到以下有效关键字:学生、课程、考试课、考查课、原始分、评测成绩、学分因此,得到下面几个类:学生类、课程类、考试课类、考查课类。+添加课程 ()+计算评测成绩() : double+姓名 : string+学号 : string+课程列表学生类+课程名 : string+学分 : double+原始分 : double考试课类+转换成绩 () : double+课程名 : string+学分 : double+原始分 : str
5、ing考查课类课程类进一步考虑,我们可以发现,考试课类和考查课类都是课程类的子类型。这种现象在面向对象的设计中称为“继承”,在UML 的类图中使用空心三角的箭头)表示继承,箭头指向父类。我们可以把相同的东西合并到父类里。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 10 页3 / 10 +添加课程 ()+计算评测成绩() : double+姓名 : string+学号 : string+课程列表学生类+转换成绩 () : double考查课类+转换成绩 () : double+课程名 : string+学分 : double+原始分
6、: string课程类+转换成绩 () : double考试课类注意,为了“统一”起见,我们将考试课的原始分也定义为了String 类型 字符串),这样,考试课的“转换成绩”要做的事是将字符串的数值还原成百分制具体的实现后面会讲到),而考查课的“转换成绩”要做的事是将等第进行转换。于是,我们就可以写出这四个类的结构: /将课程添加到课程列表中 public double 计算评测成绩( return 0.0。 说明:public 关键字是用来设定访问权限的,表示任何程序都能够访问。与它相对应还有 protected保护)、 private私有);课程列表我们使用了数组。关于数组,我们要过一段时
7、间再介绍。 return 0.0。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 10 页4 / 10 /将数值型的字符串转换为百分制return 0.0 说明:extends 关键字表示继承,这说明考试课类是课程类的子类,它继承考试类中的内容。 /将等第转换为百分制return 0.0。 3.3.2 对象对象 实例):类的实例化。客观的。对象在建立时分配了内存,创建对象实际上作了两个方面的工作:1)使用 new 关键字分配内存;2)使用构造函数初始化数据。内存空间栈内存堆内存学生对象姓名学号st 精选学习资料 - - - - - -
8、 - - - 名师归纳总结 - - - - - - -第 4 页,共 10 页5 / 10 3.3.3 使用对象1、不直接使用对象,而是使用“引用”“引用”指该类型的变量并不直接存储所包含的实际数据,而是存储实际数据的地址。2、引用间赋值时传递的是存放对象的地址3、当一个对象不被任何句柄引用时,视作“垃圾”。由JAVA 的垃圾回收机制自动销毁不再使用的对象。垃圾回收机制是在它认为适当的时候自动回收不再使用的内存的。class 测试学生类 public static void main(String args 学生类 st=new 学生类 (。st.姓名 =张三 。st.学号 =200 。Sys
9、tem.out.println(st. 姓名 +的学号为 + st.学号 。 输出:张三的学号为200 3.4 JAVA 中的常用类JAVA 中的数据类型分为“基本类型”和“引用类型”两种。基本类型存放在栈内存中,对象存放在堆内存中,而引用存放在栈内存中,并指向对象。使用 class 定义的类型称为引用类型,在使用引用类型时,不是直接使用对象,而是通过“引用”访问对象。就像使用遥控器访问电视机。3.4.1 字符串类型String Java将字符串作为String 类型对象来处理。有些出乎意料的是当创建一个String 对象时,被创建的字符串是不能被改变的。这也就是说一旦一个String 对象被
10、创建,将无法改变那些组成字符串的字符。表面上看起来,这好像是一个严格的约束。然而事实并非如此。你仍能够执行各种类型的字符串操作。区别在于每次需要改变字符串时都要创建一个新的String 对象来保存新的内容。原始的字符串不变。之所以采用这种方法是因为实现固定的,不可变的字符串比实现可变的字符串更高效。对于那些想得到改变的字符串的情况,有一个叫做StringBuffer 的 String 类的友类。它的对象包含了在创建之后可被改变的字符串。String 类和 StringBuffer 类都在 java.lang 中定义。length( 方法可以得到字符串的长度精选学习资料 - - - - - -
11、- - - 名师归纳总结 - - - - - - -第 5 页,共 10 页6 / 10 charAt(int index 方法可以从一个字符串中截取一个字符toCharArray( 方法可以将字符串中的字符转换为一个字符数组equals( 方法可以比较两个字符串是否相等indexOf(String str 搜索字符或子字符串首次出现的位置lastIndexOf(String str 搜索字符或子字符串的最后一次出现的位置substring( 方法可以截取子字符串,它有两种形式。其中第一种形式如下:String substring(int startIndex这里 startIndex 指定了
12、子字符串开始的下标。这种形式返回一个从 startIndex 开始到调用字符串结束的子字符串的拷贝。第二种形式允许指定子字符串的开始和结束下标:String substring(int startIndex, int endIndex 这里startIndex 指定开始下标,endIndex 指定结束下标。返回的字符串包括从开始下标直到结束下标的所有字符,但不包括结束下标对应的字符。replace( 方法用另一个字符代替调用字符串中一个字符的所有具体值:String s = Hello.replace(l, w 。 将字符串“ Hewwo ”赋给 s。trim( 方法去除字符串首尾空格3.4.
13、2 数值封装类在 java.lang 中定义了与基本类型相对应的类类型:双精度型Double ),浮点型Float),字节型 Byte),短整型 Short),整型 Integer)和长整型 ,parseShort( ,parseInt( , parseLong( ,parseFloat(和 parseDouble(方法。这些方法返回与调用它们的数值字符串相应的字节byte),短整型sho rt),整型int),长整型 和双精度 (double值。如果转换失败,将产生NumberFormatException 异常例 3.2 str =”123” 。try int i = Integer.pa
14、rseInt(str 。 catch(NumberFormatException e System.out.println(Invalid format。i = 0。 Integer和Long类 还 同 时 提 供 了toBinaryString( , toHexString( 和toOctalString( 方法,可以分别将一个值转换成二进制,十六进制和八进制字符串。例 3.3 int num = 19648 。System.out.println(num + in binary: +Integer.toBinaryString(num。System.out.println(num + in
15、 octal: +Integer.toOctalString(num。System.out.println(num + in hexadecimal: +Integer.toHexString(num。输出:19648 in binary: 100110011000000 19648 in octal: 46300 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 10 页7 / 10 19648 in hexadecimal: 4cc0 要将基本类型转换为字符串类型,可以调用相应类 方法。例 3.4 int i=1111。double
16、d=3.25。String s=Integer.toString(i+Double.toString(d。System.out.println(s 。到这里,我们应该可以写出考试课类的转换成绩(方法了:例 3.5 public double 转换成绩 ( try double result=Double.parseDouble(this. 原始分 。return result。 catch(NumberFormatException e return -1。 我们在主程序中输入以下代码进行测试:考试课类 ks=new 考试课类 (。ks.原始分 =96 。System.out.println(
17、ks. 转换成绩 (。输出: 96.0 3.4.3Math 类Math 类中基本成员的功能名称功能说明E 自然对数的底数2.718281827PI 圆周率3.1415926sqrt(x 计算 x 的平方根abs(x 计算 x 的绝对值sin(x 计算 x 的正弦值cos(x 计算 x 的余弦值tan(x 计算 x 的正切制log(x 计算 logex 的值,即lnx log10(x 计算 log10x 的值exp(x 计算 expow(x,y 计算 xycbrt(x 计算 x 的立方根精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 10
18、 页8 / 10 random( 在0,10上随机提取一个整数3.5 封装如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种方法去修改这个属性。在定义一个类的成员 用来对这个成员变量赋值。现在,我们就用封装的思想来改进我们的课程类:例 3.6 class 课程类 private String 课程名。private String 原始分。private double 学分。public void set 课程名 (String 课程名 this.课程名 =课程名。 public String get 课程名 ( return
19、 this.课程名。 public void set 原始分 (String 原始分 this.原始分 =原始分。 public String get 原始分 ( return this.原始分。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 10 页9 / 10 public void set 学分 (double 学分 this.学分 =学分。 public double get 学分 ( return this.学分。 public double 转换成绩 ( return 0.0。 3.6 上机练习1、把讲义中黄色底纹的代码在
20、工具中进行测试。先建立课程类,然后学生类,考试课类,考查课类,最后进行测试学生类的运行,观察结果。2、实现考查课类的转换成绩(方法,并在主程序中进行测试。可选做)练习题 课后复习)1. 有语句 String s=”hello world ”。 ,以下操作哪个是不合法的? 。B、s=3 。C、String ts=s.trim( 。 D、String t=s+” !”。2. 有程序片段如下,以下哪个表示式的结果为true? 。Float t=new Float(0.1f 。Double u=new Double(0.1 。A、s= =t B、s.equals(t C、u.equals(s D、t.
21、equals(u 3 在 Java 中,一个类可同时定义许多同名的方法,这些方法的形式参数个数、类型或顺序各不相同,传回的值也可以不相同。这种面向对象程序的特性称为 System.out.print(“ integer” +i。 void crunch(String s 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 10 页10 / 10 System.out.print(“ String” +s。 public static void main(String args Cruncher crun=new Cruncher ( 。char ch= a。int i=12 。crun.crunch(ch 。System.out.print(“ , ”。crun.crunch(i 。 答案BBC integer97 , integer12 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 10 页