1 / 159

第三章 面向对象程序设计

第三章 面向对象程序设计. 浙江工业大学 计算机学院 赵小敏 zxm@zjut.edu.cn http://210.32.200.159:9001. 主要内容. 3.1 类和对象的基本概念 3.2 类的设计 3.3 实例对象的创建和使用 3.4 封装性 3.5 继承性 3.6 多态性 3.7 修饰词 abstract 、 static 和 final 3.8 接口 3.9 包 3.10 内部类. 3.1 类和对象的基本概念. 对象是客观世界中的某个具体事物, 对象的概念是面向对象技术的核心。

michon
Télécharger la présentation

第三章 面向对象程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 面向对象程序设计 浙江工业大学 计算机学院 赵小敏 zxm@zjut.edu.cn http://210.32.200.159:9001

  2. 主要内容 • 3.1 类和对象的基本概念 • 3.2 类的设计 • 3.3 实例对象的创建和使用 • 3.4封装性 • 3.5继承性 • 3.6多态性 • 3.7 修饰词abstract、static和final • 3.8 接口 • 3.9 包 • 3.10 内部类

  3. 3.1 类和对象的基本概念 • 对象是客观世界中的某个具体事物,对象的概念是面向对象技术的核心。 • 面向对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现,它可以是有形的,也可以是无形的。 • 比如:电视是一个具体存在的,拥有外形、尺寸、颜色等外部特性(或称属性)和开、关、设置等功能的实体。

  4. 对象的基本概念 • 从程序设计的角度来看,事务的属性或特性可以用变量来表示,行为或功能则用方法来反映 • 面向对象的程序设计方法就是将客观事物抽象成为“类”,并通过类的“继承”实现软件的可扩充性和可重用性

  5. 类(class) • 类是同种对象的集合与抽象。 在面向对象的程序设计中,定义类的概念来表述同种对象的公共属性和特点。 • 类是一种抽象的数据类型,它是具有一定共性的对象的抽象,而属于类的某一对象则被称为是类的一个实例,是类的一次实例化的结果。

  6. 例如: • 日常接触的电视有很多,如松下电视、长虹电视等都属于电视的范畴,这些实体在面向对象的程序设计中将被映射成不同的对象。不难看出,这些代表不同的电视实体的对象之间存在着很多实质性的共同点。 • 类是抽象的概念,如“电视”,那么对象就是某一个具体的电视,如“小王的那台2008年出产的创维牌42吋液晶电视”。

  7. 用面向对象程序设计解决实际问题的基本思想 • 首先将实际存在的实体抽象成概念世界的抽象数据类型,这个抽象数据类型里面包括了实体中与需要解决的问题相关的数据和属性; • 然后再用面向对象的工具,如java语言,将这个抽象数据类型用计算机逻辑表达出来,即构造计算机能够理解和处理的类; • 最后将类实例化就得到了现实世界实体的面向对象的映射——对象,在程序中对对象进行操作,就可以模拟现实世界中的实体上的问题并解决之。

  8. 现实世界 映射 实体 对象 计算机逻辑的实现 抽象数据类 类 概念世界 对象、实体与类关系图

  9. 案例:学生成绩查询系统 • 教师登录系统后可输入授课课程的成绩供学生查询,并可统计学生的平均成绩和各等级的学生人数; • 学生登录系统后可查询自己的各门课程成绩;

  10. 系统分析(1):确定对象 • 找出问题描述领域中的主要名词 • 对象可能是: • 简单的或复杂的(如学生,课程) • 真实的或概念的(如课程成绩) • 对象有: • 属性 • 操作(或功能行为)

  11. Lee 80 John 75 Mark 90 Henry 65 Flank 82 JAVA程序设计 成绩 学生 课程 教师 确定学生成绩查询系统中的对象 • 学生成绩查询系统对象可能有

  12. 测试对象 • 与问题域的相关性 • 对象是否在问题陈述的界限之内? • 系统是否必须有此对象才能完成任务? • 在用户与系统的交互中是否必须有此对象? • 独立存在性 • 对象之间可以是相关的,但仍是独立存在的 • 评估一个可能的对象是否有此特征时,应考虑此对象是否需要独立存在,而不是作为另外一个对象的属性而存在 • 要有属性和操作

  13. 系统分析(2):确定对象属性和操作 • 属性:是对象的特征,属性知道某些事情。 • 可以是数据或对象 • 对学生对象来说,可能包括学号和选修课程 • 操作:是对象执行的动作,操作根据所知道的来做某些事情。 • 可以是对象做出的或施加给对象的动作,往往会影响对象的属性 • 对教师对象来说,可能是上报成绩和修改成绩

  14. 学生成绩查询系统案例研究中的对象可能的属性和操作学生成绩查询系统案例研究中的对象可能的属性和操作 • 学生 • 属性有姓名、性别、学号、班级、专业、院系、学校、登录名和密码等 • 操作有登录、查询成绩和聊天等 • 教师 • 属性有姓名、性别、工号、院系、学校、登录名和密码等 • 操作有登录、上报成绩、统计成绩、查询成绩、修改成绩等

  15. 学生成绩查询系统案例研究中的对象可能的属性和操作(续)学生成绩查询系统案例研究中的对象可能的属性和操作(续) • 课程 • 属性课程名、课程编号、学时、学分、学期、授课教师和选修学生等 • 操作有设置授课教师、获取授课教师、设置选修学生和获取选修学生等 • 成绩 • 属性有课程、学生和分数等 • 操作有设置课程编号、获取课程编号、设置学生编号、获取学生编号、设置分数和获取分数等

  16. name courseID term classHour creditHour teacher students setTeacher() getTeacher() setStudent() getStudent() Course courseID studentID scores setScore() getScore() setStudentID getStudentID setCourseID getCourseID name sex stuID classname major college School loginName password login() searchScore() chat() name sex teacherID college School loginName password login() reportScore() statisticsScore() inquireScore() modifyScore() chat() Student Teacher Score 系统分析(3):为对象建模 对象 属性 操作

  17. 作业:简单图书管理系统分析 3.1简单图书管理系统功能包括读者可以借书和还书以及查询个人借阅信息和查询图书信息,图书管理员可管理书籍基本信息和读者基本信息、更新图书借阅或归还信息以及更新图书状态等。 请分析该系统,给出对象,并为对象建模。

  18. 3.2 类的设计 类的格式 <类首声明> {<类主体>} • 类首声明定义类的名字、访问权限以及与其它类的关系等。 • 类主体定义类的成员,包括变量(数据)和方法(行为)

  19. 类首声明 • [<修饰符>] class <类名> [extends <超类名>] [implements <接口名>] • class: 类定义的关键字; • extends: 表示类和另外一些类(超类)的继承关系; • implements: 表示类实现了某些接口; • 修饰符: 表示类访问权限(public、缺省方式等)和一些其它特性(abstract、final等);一个类可以同时有多个修饰符(任意排序),但不能有相同的修饰符。

  20. 类的修饰符 • 缺省方式:class没有修饰符,只能被同一个包名中的类访问 • public:能被所有的类访问 • abstract:修饰的类被称为抽象类。抽象类就是没有具体对象的概念类。  • final:不能被继承,即类不能有子类

  21. 类主体 <类首声明> {    //类首,以下为类主体 <成员变量的声明> <成员方法的声明及实现> } • 成员变量即类的数据,反映了类的属性和状态。 • 成员方法即类的行为(对数据的操作) • 成员方法可以是普通方法、构造方法、main方法

  22. 例:声明一个学生类 • public class Student { • String name; • char sex; • int stuID; • public Student(){ } • public Student(String stuName,char sex,int stuID){ • name=stuName; • this.sex=sex; • this.stuID=stuID; • } • public void setName(String stuName){ • name=stuName; • } • public void setSex(char sex){ • this.sex=sex; • } • public void setStuID(int stuID){ • this.stuID=stuID; • } • }

  23. 成员变量的声明格式 • [<修饰符>][static][final][transient] <变量类型> <变量名> • static: 表示是一个类成员变量(静态变量); • final: 表示是一个常量(最终成员变量); 例:final double PI=3.1415926; • transient: 表示一个临时变量 • 修饰符: 表示变量的访问权限(缺省访问、public、protected和private) • 作用域:整个类。

  24. 成员方法的声明格式 [<修饰符>]<返回类型> <方法名> ([<参数表列>]) [throws <异常类>] { 方法体 } 修饰符: 方法的访问权限(缺省的、public、protected和private) static: 类方法(静态方法); abstract: 抽象方法(无方法体的方法); final: 最终方法(不能被子类改变)。 throws: 表示抛出异常

  25. 构造方法 • 类的构造方法是一种特殊方法,作用是在创建对象时Java系统调用构造方法去初始化新建对象的成员变量; 例:Student s1=new Student(“张三”,’男’,20080301); • 如果没有自定义构造方法,则Java调用类的默认构造方法。Java将使用缺省值来初始化成员变量。 例:Student s2=new Student();

  26. 构造方法的特性 • 类的构造方名必须和类名相同; • 构造方法没有返回值(在构造方法名字前连void也不要加); • 可以有public, protected, private等任何访问的修饰者没有修饰。 但不能有以下非访问性质的修饰: abstract, final, native, static 或 synchronized。

  27. 3.3 实例对象的创建和使用 • 创建对象的两种方式: (1)先声明对象,然后实例对象 例:Student s; //声明对象 s=new Student(); //实例化对象 (2)<类名> <对象名>=new <类名>(参数); 例: Student s=new Student();

  28. 实例化(创建对象) • 实例化就是为对象分配存储空间,并同时对对象进行初始化。 • 用new运算符和类的构造方法Student( )来完成。

  29. 例: Shirt.java • public class Shirt{ • char size; • float price; • boolean longSleeved; • public static void main (String args[]){ • Shirt myShirt= new Shirt(); • Shirt anotherShirt=new Shirt(); • myShirt.size = 'M'; • myShirt.price = 22.99F; • myShirt.longSleeved = false; • anotherShirt.size = 'L'; • anotherShirt.price = 29.99F; • anotherShirt.longSleeved = true; • anotherShirt=myShirt; • anotherShirt.size= 'S'; • } • }

  30. 0X99F03312 anotherShirt Shirt Shirt 0X99F31244 myShirt size size ‘\u0000’ ‘\u0000’ price price 0.0 0.0 longSleeved longSleeved false false 堆栈内存 (在程序空间内) 堆内存 (附加内存在程序空间外) 执行下列代码的内存分配1 • Shirt myShirt = new Shirt(); • Shirt anotherShirt = new Shirt();

  31. 0X99F03312 anotherShirt Shirt Shirt 0X99F31244 myShirt size size ‘\u0000’ ‘M’ price price 22.99F 0.0 longSleeved longSleeved false false 堆栈内存 (在程序空间内) 堆内存 (附加内存在程序空间外) 执行下列代码的内存分配2 • myShirt.size = 'M'; • myShirt.price = 22.99F; • myShirt.longSleeved = false;

  32. 0X99F03312 anotherShirt Shirt Shirt 0X99F31244 myShirt size size ‘M’ ‘L’ price price 29.99F 22.99F longSleeved longSleeved true false 堆栈内存 (在程序空间内) 堆内存 (附加内存在程序空间外) 执行下列代码的内存分配3 • anotherShirt.size = ‘L'; • anotherShirt.price = 29.99F; • anotherShirt.longSleeved = true;

  33. Shirt Shirt 0X99F31244 myShirt size size ‘L’ ‘M’ price price 22.99F 29.99F longSleeved longSleeved true false 堆栈内存 (在程序空间内) 堆内存 (附加内存在程序空间外) 执行下列代码的内存分配4 15. anotherShirt=myShirt; 0X99F03312 0X99F31244 anotherShirt

  34. Shirt Shirt 0X99F31244 myShirt size size ‘L’ ‘M’ price price 22.99F 29.99F longSleeved longSleeved false true 堆栈内存 (在程序空间内) 堆内存 (附加内存在程序空间外) 执行下列代码的内存分配5 16. anotherShirt.size=‘S’; 0X99F03312 0X99F31244 anotherShirt ‘S’

  35. 练习:仔细阅读下面的程序 ,输出结果是什么? • public void another(ValHold v, int i) { • i = 0; • v.i = 20; • ValHold vh = new ValHold(); • v = vh; • System.out.print(v.i); • System.out.print(i); • } • } • class ValHold{ • public int i = 10; • } • ObParm • public class { • public static void main(String argv[]) { • ObParm o = new ObParm(); • o.amethod(); • } • public void amethod() { • int i = 99; • ValHold v = new ValHold(); • v.i = 30; • another(v , i); • System.out.print(v.i); • } 输出结果: 10020

  36. 3.4 封装性 • 目的 • 限制在类的外部对类内部成员进行访问,只通过公共接口来访问类的成员数据。 • 屏蔽细节:这是程序设计的基本思想方法,便于程序功能的扩展和程序的维护。 • 封装类 • 大多数变量都是私有的,变量通过他们自己类的方法修改,其它类都只与一个类中很少的几部分接口; • 若变量或方法为公有,它就是接口的一部分,其它类可以访问它;若为私有,它是实现的一部分,只有类自己的成员可以访问它

  37. 权 限 同一类 同一包 不同包的子类 所有类 public 允许 允许 允许 允许 protected 允许 允许 允许 不允许 默 认 允许 允许 不允许 不允许 private 允许 不允许 不允许 不允许 访问权限的设置

  38. 类的访问权限的设置 • 类的权限有两种:默认和public。 • 如果在一个源程序文件中,声明了若干个类的话,只能有一个类的权限关键字是public。这个类的名字应该和程序文件同名,main方法也应该在这个类中。

  39. 类的成员的访问权限设置 • 用权限关键字设置类的成员的权限,以此决定是否允许其类外部的代码访问这些成员。 例: private int name,sex,age,stuID; public void setName(String name);

  40. 访问控制方式:public • 被修饰为public的类是公共类,它可供所在包的其他类使用,也可供其他包中的类使用,在程序中可以用import语句引入其他包中的public类。 • 被public定义的类中成员变量或方法可以供其他类访问,表明对外开放的方式;一般类的定义中,含有少量(或者没有) public 变量,部分 public 方法。

  41. 访问控制方式:private • 设置private访问权限,则该类的成员只能被同一类中的成员访问,而不让其他类进行访问。 • 目的: 隐藏具体的实现细节 • 变量常常是private • 采用 public “get” 方法读取数据 • 采用 public “set”方法写数据

  42. 访问控制方式:protected • 同一个包内的所有类的所有方法都能访问该成员 • 如果不在同一个包内的类的方法要访问该成员,则该类必须是该成员所在的类的子类

  43. 访问控制方式: 默认 (缺省方式) 默认的权限,该类的成员能被同一包中的类访问。

  44. 封装性的可以带来的优点 • 基本思想: 提供对外的通讯方式,封装内部的实现机制 • 增加内部实现部分的可替换性 • 减小类之间的耦合关系,方便模块划分 • 容易保证类内部数据间的一致性,从而提高软件的可靠性

  45. 何时为public或private? • 基本思想 • 类常常是public • 成员变量常常是private. • 构造方法一般是public. • 方法“get”与“set”是 public. • 其它方法需要根据实际的需要而定 • 上面的思想可以用于大部分的程序设计(也许90%)

  46. 例子:根据以下的设计要求编写java源代码。 类名: Student 变量(访问权限均为private): name(String) //姓名 age(int) //年龄 方法: 构造方法(没有参数,设置姓名为“无名氏”,年龄为20) setName(有一个名为name的String型参数,将name的值设为这个新值), getName (没有参数,返回姓名) setAge(有一个名为age的int型参数,将age的值设为这个新值), getAge (没有参数,返回年龄) isSameAge(有一个参数s,是另一个Student对象的引用,如果两个Student对象的age相同,则返回true,否则返回false)

  47. public class Student{ • private String name; • private int age; • public Student(){ • name="无名氏"; • age=20; • } • public void setName(String name){ • this.name=name; • } • public String getName(){ • return name; • } • public void setAge(int age){ • this.age=age; • } • public int getAge(){ • return age; • }

  48. Student类(续) • public boolean isSameAge(Student s){ • if(s.age-this.age==0) return true; • return false; • } • public static void main(String args[]){ • Student s1=new Student(); • Student s2=new Student(); • s2.age=20; • System.out.println(s1.isSameAge(s2)); • } • }

  49. 作业 3.2、根据以下的设计要求编写java源代码。 类名: Teacher 实例数据(均为private): name(String) //姓名 teacherID(int) //工号 方法: 构造方法(没有参数,设置姓名为“无名氏”,年龄为20) setName(有一个名为name的String型参数,将name的值设为这个新值), getName (没有参数,返回姓名) setTeacherID (有一个名为tID的int型参数,将teacherID的值设为这个新值), getTeacherID (没有参数,返回工号)

  50. 作业 3.3、创建一个名为Rectangle的类来表示一个使用宽度和高度来改变量的矩形,矩形的宽度和高度由构造方法来确定。为Rectangle类创建下列方法: • getArea返回矩形的面积,要求长和高的范围为10~50; • getPerimeter返回矩形的周长; • drawRect使用星号(*)作为描绘字符画出该矩形的形状(假设宽度和高度为整数); 在另一个类TestRectangle中编写main方法来测试Rectangle类。

More Related