第三讲面向对象程序设计方案思想——类和封装
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章面向对象程序设计思想<1)——类
和封装
3.1面向对象设计方法的由来
<1)提高软件的可维护性和可复用性
●如何同时提高软件的可维护性和可复用性是现代软件工程的核心问题
●一个好的软件设计,必须能够允许新的设计要求以较为容易和平和的方式加
入到已有的系统中去,从而使这个系统能够不断的焕发青春。
●复用的重要性:提高生产效率、提高软件质量、改善软件可维护性
●传统的复用方法:代码粘贴、算法复用、数据结构复用
<2)问题抽象的进步
●所有编程语言都是对目标问题的“抽象”。
●汇编语言用机器的思维去考虑问题,是面向机器的抽象
●高级语言以接近自然语言的思维去考虑问题,是面向问题的抽象
●面向对象语言以自然界“物质”的思维去考虑问题,认为程序是由一堆对象
相互作用的结果
<3)机器性能的提高
●思维的抽象越来越接近自然,也就意味着要用越来越多的“额外”代码来做
支撑。
●软件执行速度和复用型、可维护性常常是一对矛盾
3.2“纯粹”的面向对象程序设计方法是什么样的
<1)所有东西都是对象
可将对象想象成一种新的类型;
同一类的对象具有相同的属性名称和方法;
<2)程序是一堆对象相互作用的结果。它们通过相互发送消息来彼此作用为了告诉对象做什么,需向那个对象“发送一条消息”。具体地讲,可将消息想象为一个调用,它调用的是从属于目标对象的一个子例程或函数。
<3)每个对象是独立的,也就是拥有独立的存储空间
<4)每个对象都有一种类型
<5)同一类型的各个对象,它们能接收的消息是相同的
<6)程序通过引用访问对象
3.3对象和类 3.3.1类
人们对事物的抽象描述,概括出该事物所具有的属性和方法,并将其进行封装,以供使用。
用class 定义类,声明类的形式为:
[附加声明] [访问修饰符] class 类名称[extends [基类] {
[属性] [方法] }
例3.1
每位学生每学期最多有15门课程,课程有考试课和考查课两种。课程成绩的原始分按正常考试/考查实际得分计算。考试课的原始分使用百分制形式,考查课的原始分采用等第形式<优秀、良好、中等、及格、不及格)。在进行测评成绩计算时,考查课程成绩中的优秀、良好、中等、及格、不及格的,分别换算成为95、85、75、65和50分。测评计算公式为:
分析:
从上面描述中可以得到以下有效关键字:学生、课程、考试课、考查课、原始分、评测成绩、学分
因此,得到下面几个类:学生类、课程类、考试课类、考查课类。
进一步考虑,我们可以发现,考试课类和考查课类都是课程类的子类型。这种现象在面向对象的设计中称为“继承”,在UML
的类图中使用空心三角的箭头承,箭头指向父类。我们可以把相同的东西合并到父类里。
注意,为了“统一”起见,我们将考试课的原始分也定义为了String类型<字符串),这样,考试课的“转换成绩”要做的事是将字符串的数值还原成百分制<具体的实现后面会讲到),而考查课的“转换成绩”要做的事是将等第进行转换。
于是,我们就可以写出这四个类的结构:
<1)学生类
class 学生类
{
public String 姓名。
public String 学号。
public 课程类[] 课程列表。
public void 添加课程(课程类课程>
{
//将课程添加到课程列表中
}
public double 计算评测成绩(>
{
return 0.0。
}
}
说明:
●public关键字是用来设定访问权限的,表示任何程序都能够访问。与它相对应还
有protected<保护)、private<私有);
●课程列表我们使用了数组。关于数组,我们要过一段时间再介绍。
<2)课程类
class 课程类
{
public String 课程名。
public String 原始分。
public double 学分。
public double 转换成绩(>
{
return 0.0。
}
}
<3)考试课类
class 考试课类 extends 课程类
{
public double 转换成绩(>
{
//将数值型的字符串转换为百分制
return 0.0
}
}
说明:
extends关键字表示继承,这说明考试课类是课程类的子类,它继承考试类中的内容。
<4)考查课类
class 考试课类 extends 课程类
{
public double 转换成绩(>
{
//将等第转换为百分制
return 0.0。
}
}
3.3.2对象
对象<实例):类的实例化。客观的。
对象在建立时分配了内存,创建对象实际上作了两个方面的工作:
<1)使用new关键字分配内存;
<2)使用构造函数初始化数据<构造函数是与类名同名的函数)。
学生类 st=new学生类(>。
3.3.3使用对象
1、不直接使用对象,而是使用“引用”
“引用”指该类型的变量并不直接存储所包含的实际数据,而是存储实际数据的地址。
2、引用间赋值时传递的是存放对象的地址
3、当一个对象不被任何句柄引用时,视作“垃圾”。由JA V A的垃圾回收机制自动销毁不再使用的对象。垃圾回收机制是在它认为适当的时候自动回收不再使用的内存的。
class 测试学生类
{
public static void main(String[] args>
{
学生类 st=new 学生类(>。
st.姓名="张三"。
st.学号="200"。
System.out.println(st.姓名+"的学号为"+ st.学号>。
}
}
输出:
张三的学号为200
3.4 JAVA中的常用类
JA V A中的数据类型分为“基本类型”和“引用类型”两种。基本类型存放在栈内存中,对象存放在堆内存中,而引用存放在栈内存中,并指向对象。
使用class定义的类型称为引用类型,在使用引用类型时,不是直接使用对象,而是通过“引用”访问对象。就像使用遥控器访问电视机。
3.4.1字符串类型String
Java将字符串作为String类型对象来处理。
有些出乎意料的是当创建一个String 对象时,被创建的字符串是不能被改变的。这也就是说一旦一个String 对象被创建,将无法改变那些组成字符串的字符。表面上看起来,这好像是一个严格的约束。然而事实并非如此。你仍能够执行各种类型的字符串操作。区别在于每次需要改变字符串时都要创建一个新的String 对象来保存新的内容。原始的字符串不变。之所以采用这种方法是因为实现固定的,不可变的字符串比实现可变的字符串更高效。对于那些想得到改变的字符串的情况,有一个叫做StringBuffer 的String 类的友类。它的对象包含了在创建之后可被改变的字符串。
String类和StringBuffer类都在ng中定义。
length( >方法可以得到字符串的长度