Presentation is loading. Please wait.

Presentation is loading. Please wait.

Java软件开发基础 4. 面向对象的程序设计基础.

Similar presentations


Presentation on theme: "Java软件开发基础 4. 面向对象的程序设计基础."— Presentation transcript:

1 Java软件开发基础 4. 面向对象的程序设计基础

2 4.1 面向对象基础 对象 对象的状态属性 对象的行为操作 某类事物的抽象。 对象间的关联和作用 对象蕴含着许多信息,可以用一组状态来表征。
对象内部含有对数据的操作,即对象的行为操作。 某类事物的抽象。 某类对象是对现实世界具有共同特性的某类事物的抽象。 对象间的关联和作用 面向对象技术正是利用对现实世界中对象的抽象和对象之间相互关联、相互作用的描述来对现实世界进行模拟,并且使其映射到目标系统中,对象之间存在相互关联和相互作用。 现实世界中复杂的对象是由许多小的、简单的对象组成的。客观存在的物体就是最基本的对象。不同的物体有共性,共性存在于个性之中,物体的个性又继承了共性。

3 面向对象软件的开发过程 面向对象的分析(OOA:Object Oriented Analysis)
这一阶段应由用户和开发人员共同完成。 面向对象的设计(OOD:Object Oriented Design) 将对OOA模型加以扩展,引入界面管理、任务管理和数据管理三部分内容,得到OOD模型,并对最初的OOD模型做进一步的细化分析、设计和验证。在明确各对象类的功能和组成时,充分利用已存在的、可获得的对象类或组件。 面向对象的程序设计和问题求解力求符合人们日常自然的思维习惯,降低、分解问题的难度和复杂性,提高整个求解过程的可控制性、可监测性和可维护性,从而达到以较小的代价和较高的效率获得较满意效果的目的。

4 面向对象的实现(OOP:Object Oriented Programming)
在较大型的开发项目中,通常设置专人专门负责管理所有的可重用资源,将这些资源组织成类库或其他的可重用结构。 面向对象的实现(OOP:Object Oriented Programming) 就是具体的程序编码阶段,主要任务如下: 选择一种合适的面向对象的编程语言; 用选定的语言编码实现详细设计过程; 用相关的公式、图表、说明和规则等对软件系统各对象与类进行详尽的 描述; 将编写好的各个类代码块根据类的相互关系集成; 利用开发人员提供的测试样例和用户提供的测试样例分别检验代码完成 的各个模块和整个软件系统。 在面向对象的开发过程中,测试工作可以随着整个实现阶段编码工作的深入而同步完成。 编程阶段完成后进入运行阶段。 将程序看做由一系列对象组成,而不是由一系列动作组成。 我们需要做的是将整个程序拆分成若干个不同的对象,由每个对象来完成特定的功能,而不再是将整个任务划分为子任务。

5 4.2 类 类的概念 类是对某类对象的抽象描述,将数据属性及其相关操作封装在一起的集合体,它是对象的模板或蓝图。每一个对象都含有特征与行为,将其中的共性进行抽象描述,就形成了类。 尺寸 型号 生产厂家 用户 打开 关闭 调频 调音

6

7 类的修饰符:用来说明类的属性,可分为访问控制符和非访问控制符两类。
类与对象的关系 类的定义格式 类声明 类体 类的修饰符:用来说明类的属性,可分为访问控制符和非访问控制符两类。 访问控制符 public:表示该类可以被任何对象或类来调用或引用,包括同一个包或 不同包中的类访问。一个程序中只能有一个公共类。

8 private:表示只能被该类的方法访问和修改,而不能被任何其他类、包括 该类的子类来获取和引用,这是系统默认的修饰符。
非访问控制符 abstract:抽象类。表示该类是无具体对象的抽象类,这是一种特殊的类 ,它不能实例化,即不能用new关键字来生成该类的对象,只能由其派生 子类。其抽象方法的具体实现也由继承该抽象类的子类来完成。 final:表示该类为最终类,不能再由它派生新的子类。 注意: 抽象类可以同常规类一样,具有数据和方法,包含抽象方法的类必须声明 为抽象类。 abstract和final不能修饰同一个类。 关键字 class extends:指明该类的父类(如果有的话) implements:用来引出接口,以供本类中使用,接口可以有多个

9 整个类的详细结构 类体 方法 用于完成变量(属性)的说明以及方法(行为)的定义与实现。 围绕着类的属性进行各种操作;
与其他的类或对象进行数据交流、消息传递等操作。 整个类的详细结构

10

11 4.3 成员变量 变量包括以下几种 成员变量的声明 修饰符
成员变量(Data field):也称为字段,定义在类中,是类成员的一部分,整个类都可以访问它。 方法或者代码块中的变量(local variable):即局部变量。 方法声明中的变量(parameter):也称为形式参数。 成员变量的声明 零个或多个修饰符 字段类型 字段名称 修饰符 缺省访问修饰符:同friendly修饰符,修饰的成员变量可以被同一包(package)中的任何类访问; [修饰符] 类型 成员变量名;

12 public:修饰的成员变量称为公共变量,可以被项目文件中的任何方法访问。
protected:修饰的成员变量称为保护变量,可以被有继承关系的类自由访问,即子类可以访问它;也可以由同一个包中的其它类访问。 private:修饰的成员变量称为私有变量,只能被定义它的类使用,而不能被其他任何类使用。这种方式通常是最安全的,在Java程序开发中通常使用该修饰符实现数据的封装; private protected:私有保护访问控制符。只允许该类本身以及子类访问,把同一个包中的其他类严格排除在外,使得成员变量更专有于具有明确继承关系的类,而不是松散组合在一起的包。 由于public成员变量不受限制,这易使类的对象引起不希望的修改,破坏系统的封装性,建议成员变量尽量不要使用public修饰符;

13 成员变量修饰符访问权限 static:修饰的成员变量又称为类变量,不加static修饰的成员变量又叫对象变量。对象变量依附于具体的对象实例,它的值因具体对象实例的不同而不同,而类变量为该类的所有对象所共享,它的值不因类的对象不同而不同。 修饰符 子类 其它类 同一个包 其它包 public private protected 默认修饰符 private protected

14 用该修饰符修饰的成员变量不是被保存在由该类创建的某个具体对象的存储单元中,而是被保存在该类内存区域的一个公共的存储单元中。
静态变量在类被载入时创建,只要类存在,静态变量就可见,该静态变量由该类所创建的所有对象共享。 所有的操作都是针对该内存单元。 访问方式如下: 实例:N个人顺次等待电梯并使用的例程 类WaitE的属性 电梯的位置 电梯运行速度 人所在的位置 人要去的目的地 对象名.成员变量名 类名.成员变量名

15 类的方法 获得电梯位置 获得电梯速度 构造方法

16 对于某个具体等待电梯的人的操作 打印等待时间 打印乘坐时间 创建并初始化(即此人在哪一楼层,要去往哪一楼层)
将电梯置位为该对象目前所在的楼层 将电梯置位为该对象到达的楼层

17

18

19 final:修饰的成员变量叫最终成员变量,亦即常量。
一开始创建该变量时将其设了一个初始值,在以后程序的运行过程当中,变量的值将一直保持这个值不变。 Java中的常量必须是类的成员。对于最终成员变量,任何赋值都将导致编译错误。因为常量在声明以后就不能改变其值,所以常量必须要初始化。无论是实例变量,还是类变量,都可以被说明成常量。final修饰符和static修饰符并不冲突。

20 2017/2/24 4.4 方法 概述 方法是类的主要组成部分,又称为成员方法,用来规定类属性上的操作,改变对象的属性与产生行为,实现类的内部功能的机制,接收来自其他对象的信息以及向其他对象发送消息。方法同时也是类与外界进行交互的重要窗口。 通常一个类由一个主方法和若干个子方法构成。主方法调用其他方法,其他方法间也可以互相调用,同一个方法可以被一个或多个方法调用。 方法实现子任务处理的原则和规律: 算法中需要细化的步骤、重复的代码以及重载父类方法都可以定义成类的方法; 方法应界面清晰、大小适中。 Java应用程序中,程序的执行从主方法即main方法开始,调用其他方法后返回到main方法,并在main方法中结束整个程序的运行。

21 定义格式 修饰符 方法头 方法体 public:公共方法,可被所有类访问; private:私有方法,只能被定义它的类、方法访问;
protected:保护方法,可以定义它的类及其子类、同一个包中的其它类访问,该修饰符的目的就是为了使其他包中的子类可以访问父类中的成员变量和方法; abstract:抽象方法,仅有方法头而没有具体方法体的方法,所有的抽象方法必须存在于抽象类中; final:最终方法,不能被覆盖或重载;

22 变量 synchronized:可完成同步监控代理,被该修饰符修饰的方法,一次只能被一个线程使用,进而可以控制多个并发线程的访问;
static:静态方法或类方法。属于整个类的方法,可通过类名直接调用; 变量 在方法体中定义的变量以及方法的参数称为局部变量,方法的参数在整个方法内有效,方法内定义的局部变量自它被定义的位置之后到方法体结束之间有效。 如何判断一个变量或方法定义为实例的还是静态的? 如果一个变量或方法依赖于类的具体实例,就应该定义为实例变量或实例方法;如果一个变量或方法不依赖于类的具体实例,就应该定义为静态变量或静态方法。 本应该声明为静态方法而声明为实例方法是常见的设计错误。

23 参数列表 是方法的输入接口,列出了一系列参数的形式,包括个数、类型和名称,这类参数只有在运行时才分配存储单元,被称为“形式参数”。 对于方法定义中的每一个参数必须合法,调用时必须由一个实参量与其对应,参量的个数、类型必须与对应的形参的个数、类型完全一致。 方法也可以没有参数。 方法不能嵌套定义。 返回值类型 可以是任意的Java类型,甚至可以是定义此方法的类或者方法可实现接口,如果方法没有返回值,则用void表示。 在区分多个同名方法时,编辑器不会考虑返回值类型,所以不能声明两个参数列表相同而返回值不同的同名方法。 当方法使用一个类名作为返回值类型时,返回对象的类型必须是返回类型指定的类或者它的子类。

24 方法的分类 方法的调用 throws异常列表 方法体 用户自定义的方法 标准方法 程序调用方法:需要程序书写专门的调用命令来调用的方法;
规定了在方法执行中可能导致的异常。 方法体 方法体是实现这个方法的代码段;当方法体是一个“;”时表示无方法体,该类没有实现。当且仅当方法的修饰符中有abstract或native时,方法才无方法体。 方法的分类 用户自定义的方法 标准方法 方法的调用 程序调用方法:需要程序书写专门的调用命令来调用的方法; 系统方法:运行过程中不需书写专门命令而由系统自动调用的方法。

25 方法的调用格式 实际参数列表是传递给方法的参数,可以是常量、变量或表达式,个数、类型、顺序应该与形式参数一一对应;
在类中调用类自身的方法可以直接使用该方法名称;否则需要使用前缀; 调用方法的执行过程是:首先将实际参数传递给形式参数,然后执行方法体,执行结束后从调用方法语句的下一句继续执行。 [对象引用名.]方法([实际参数列表])

26 方法表达式调用 方法语句调用 输出语句调用

27

28

29 参数 参数传递 指在Java语言中调用一个带有形参的方法时,完成所提供的实参与形参的传输结合的过程。
形参是方法声明中的变量清单; 实参(argument)是调用方法时传递给方法的实际值。 Java不允许将方法传递给方法,但是可以将对象传递给方法,然后调用这个对象的方法。 传递方式 传值:若方法参数为简单数据类型,将实参的值传递给形参,方法接受 实参的值,但是不能改变; 传引用:若方法参数是复合数据类型,则将对象的引用传递给方法。

30

31

32

33 参数名称 在参数的作用域内,参数的名称必须唯一。
参数名称可以和一个类的字段名称相同,如果这样使用,该参数被称为使这个字段遮蔽(shadow)。遮蔽的字段会使代码难以阅读。 在上述语句中,setOrigin方法的两个参数将该类的同名字段遮蔽,若 在方法体内部使用简单名称x和y,则表示引用参数,而不是引用该类的 字段。如果要访问字段,必须使用限定名称。 按照惯例,遮蔽只在设置特定字段的构造方法或者方法中使用。

34 任意数量的实参 当不知道有多少个特定类型的实参要传递给方法时,可以使用可变参数(vararg)。方法体中的代码将把参数作为数组来处理。
格式如下 最常用到可变参数的地方是输出方法,如 [修饰符] 返回值类型 方法名([形式参数列表,]最后一个参数的类型… 参数名称) public PrintStream printf(String format, Object… args)

35 特殊的方法调用——递归 递归是指用自身结构来描述自己、循环调用。例如: 递归方法有直接递归方法和间接递归方法。 递归方法调用涉及两个概念:
阶层 Fibonacci数列 递归方法有直接递归方法和间接递归方法。 方法体中又调用自身称为直接递归方法;方法体中调用的虽然不是自身,但是它间接调用了自身,称为间接递归方法。 递归方法调用涉及两个概念: 栈:数据依次入栈,后进先出。 递归方法调用数据的保留:每调用一次便分配一次局部变量,待调用结束局部变量就释放。但从递归过程的执行可以看出,上一次调用的执行尚未结束,下一次调用就开始了。所以递归调用的数据保留采用栈来解决。

36

37 1 fac(5) ? 2 fac(4) 3 fac(3) 4 fac(2) 5 fac(1) 1 fac(5) ? 2 fac(4) 3 fac(3) 4 fac(2) 由于n不等于1,所以连续执行4次fac(n-1) 第四次n=1,所以fac(1)=1,退栈一次,弹出栈顶数据。 1 fac(5) ? 2 fac(4) 3 fac(3) 6 5 fac(5) 120 再一次执行fac(n)=n*fac(n-1),得到fac(n)=6,退栈。 以后的步骤类似,最后一次执行,n为5,fac(4)=24,fac(5)=120

38 4.5 对象与构造方法 对象的创建 一个类可以创建多个实例对象,对象的生成包括声明、实例化和初始化。
对象的生命周期为:创建使用销毁回收。 语法格式 new后带小括号的类名称为构造方法。 默认的、最简单的构造方法是不带参数的。 执行操作 在指定类上创建了一个对象; 为该对象分配了引用内存空间; 执行由指定类所定义的构造方法,完成一系列初始化工作。 类名 对象名; 对象名=new 类名([参数列表]); 类名 对象名=new 类名([参数列表]);

39 构造方法 类创建对象时需要使用构造方法,以便为类所创建的对象一个合理的初始状态。 特点
注意:在初始化工作时如果没有给属性赋值,虚拟机会自动给它们赋予 相应数据类型默认的初值。 构造方法 类创建对象时需要使用构造方法,以便为类所创建的对象一个合理的初始状态。 特点 名字必须与它所在类的名字完全相同,并且不返回任何数据类型; Java中每个类都有构造方法,在new运算符完成操作前,构造方法立刻自动调用,用来完成初始化该类的对象; Java允许一个类中有若干个构造方法,但这些构造方法的参数必须不同。

40 构造方法实例:矩形类的构造 如果程序中没有显示的编写构造方法,则Java将为该类创建一个默认的构造方法。
重载经常用于构造方法,构造方法也可以继承。 注意 虽然编译器会自动为没有构造方法的所有类提供无参数的默认构造方法 ,但是这个默认构造方法会调用该类的父类的无参数构造方法。此时, 如果父类没有无参数构造方法,编译器就会指出问题。所以必须检查其 父类是否具有无参数构造方法。 当然,如果该类没有为它显式的定义父类,则它的隐式父类是Object类 ,该类的确具有无参数构造方法。 构造方法实例:矩形类的构造 属性: 矩形长 矩形高 矩形中心所在坐标点

41 坐标点类 横坐标 纵坐标 构造方法 矩形类构造方法

42 类中定义的其他方法 关键字this 在构造方法中,this引用当前对象,即被调用的构造方法所属的对象。通过使用this关键字,可以在构造方法中引用当前对象的任何成员。 对字段使用关键字this。这种情况的最常见原因是构造方法的参数遮蔽 了对象的成员字段。

43 对构造方法本身使用this 使用this关键字调用同一个类中的另一个构造方法,称为显式构造方法 调用(explicit constructor invocation)。格式如下: 编译器根据参数的数量和类型判断应该调用哪个构造方法。 如果存在,对另一个构造方法的调用必须是构造方法中的第一行。 this(参数列表);

44 用四个0值调用四个参数的构造方法 用两个0值和width、height值调用四个参数的构造方法

45 new 构造方法名([参数列表]).成员变量名
使用对象 引用成员变量:定义、创建及初始化一个对象以后,就可以引用该对象的成员变量。 类对象已经创建 创建对象与引用成员变量同时进行 注意,用这种语句来获取成员变量的方法,当执行完该语句之后,程序 再也不具有对创建出的该对象类的引用,因为程序从未把该引用存储到 任何位置。对象被解除引用,并且其资源被Java虚拟机回收。 对象名.成员变量名 new 构造方法名([参数列表]).成员变量名

46 new 构造方法名([参数列表]).成员方法名([参数列表])
引用成员方法:定义、创建及初始化一个对象以后,就可以引用该对象的成员方法。 类对象已经创建 创建对象与引用成员变量同时进行 对象名.成员方法名([参数列表]) new 构造方法名([参数列表]).成员方法名([参数列表]) 常见的编程错误: --带有void关键字的构造函数 构造函数本身没有返回类型,当为构造函数提供了“void”返回类型时,它就不再是构造函数,而仅仅是一个普通的实例方法,该方法名字与构造函数相同。该错误并不会引起编译错误,而当需要创建实例的时候就会找不到相应的构造方法。

47

48 并非实例、类变量和方法的所有组合都被允许使用
对象的清除 当不存在对一个对象的引用时,该对象成为一个无用对象。Java的运行环境周期性的检测某个实体是否已经不再被任何对象所引用,如果存在,则收集并释放它占有的内存空间。 并非实例、类变量和方法的所有组合都被允许使用 实例方法可以直接访问实例变量和实例方法 实例方法可以直接访问类变量和类方法 类方法可以直接访问类变量和类方法 类方法不能直接访问实例变量和实例方法,它们必须通过对象引用。

49 数组名[下标]=new 类名([参数列表]);
4.6 复合数据类型数组 复合数据类型数组的定义和基本数据类型结构定义类似,步骤如下: 声明数组对象 创建,并初始化数组的长度 初始化每个数组中的元素(即对象) 经过以上步骤才为每个数组元素分配了存储空间,才可以引用复合数据类型数组中的元素。 类名 数组名[]; 类名 数组名=new 类名[数组的大小]; 数组名[下标]=new 类名([参数列表]);

50 实例:为某个班级创建一个学生类,并生成实例进行操作,判断是否能获得奖学金。
类的声明 分析学生类应该具有的属性 姓名 班级 平均分 家庭年收入

51 成员方法 获取姓名 获取班级 获取平均分 获取家庭年收入

52 通过复合数据类型数组在另一个类中生成4个学生对象
构造方法 采用带有三个参数的构造方法,为学生的三个属性进行初始化 通过复合数据类型数组在另一个类中生成4个学生对象

53 打印学生信息 判断是否有学生获得奖学金

54

55 修改器: 用于修改对象内部状态的实例方法; 一般说来,修改器都会修改对象中某个字段的值,作为一种约定,修改器方法的名称往往以“set”开头,加上需要修改的字段名称。 通常修改器方法的返回值为void类型,而它的参数是对象的新状态或对现有状态的改变量。 访问器: 只访问对象的状态信息,但不修改它们的实例方法; 访问器会返回对象中某个字段的值,作为一种约定,访问器方法的名称往往以“get”或“is”开头,加上需要访问的字段名称。 通常访问器方法没有参数,但必须有返回值。

56 面向对象程序设计方法的优点* 面向对象方法的特性 抽象性(Abstraction)
是具体事物一般化的过程,即对具有特定属性的对象进行概括,从中归纳出该类对象的共性,并从通用性的角度描述共有的属性和行为特征。 抽象使得系统能够抓住事物的实质特征,因此具有普遍性,可以使用在不同的问题中。 抽象包括以下两方面内容: 数据抽象:描述某类对象的共同属性 方法抽象:描述某类对象的行为特征 Java中,通过定义属性和行为来表述对象的特征和功能,通过定义接口来描述它们的地位以及与其他对象的关系,最终形成一个广泛联系的、可理解、可扩充、可维护、更接近于问题本来面目的动态对象模型系统。

57 封装性(Encapsulation) 继承性(Inheritance)
利用抽象数据类型将数据和基于数据的操作封装在一起,即把对象的属性和行为结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节。 封装的特点是使某类能建立起严格的内部结构,保护好内部数据,减少外界的干扰,以保证类自身的独立性,可工作在不同的环境中。 对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的错误影响,使软件错误局部化,进而大大减少查错和排错的难度。 继承性(Inheritance) 是面向对象程序设计中最具魅力的特色,是软件复用的一种形式,对降低软件的复杂性行之有效。使得程序结构清晰、降低编码和维护的工作量,提高了系统效率。 Java中的所有类都是通过直接或间接的继承java.lang.Object类得到。

58 采用对象但没有继承性的语言是基于对象的语言,不是面向对象的语言。
新类由已经存在的类(父类)生成,通过保留它们的属性和行为,并且根据新类自身的特色和要求加以修改,增加新的属性和行为。通过继承得到的类称为子类,被继承的类称为父类。 类继承就是子类继承父类的成员变量和方法,作为自己的成员变量和方法,就好像它们是在子类中直接声明的一样。当然,子类能否继承父类的变量和方法还有一定的限制。 子类从父类继承主要包括以下两方面: 属性 方法 继承的分类 单继承 多继承:子类从一个以上的父类继承,Java不支持多继承

59 多态性(Polymorphism) 指程序中同名的不同方法共存的情况下,Java根据调用方法时传送参数的多少及传送参数的类型来调用具体不同的方法,即可采用同样的方法获得不同的行为特征。在运行时自动选择正确的方法进行调用称为动态绑定(Dynamic Binding)。 多态性可提高程序的抽象程度,使得一个类在使用其他类的功能、操作时,不必了解该类的内部细节,只需明确它提供的外部接口。 多态的两种情况 覆盖(Override):子类对继承自父类的方法重新定义 重载(Overload):在同一个类中定义多个同名的不同方法

60 面向对象程序设计方法的优点 可重用性 可扩展性 可管理性 可自律性 可分离性 接口和消息机制


Download ppt "Java软件开发基础 4. 面向对象的程序设计基础."

Similar presentations


Ads by Google