java实用程序设计(西电版)第3章java面向对象的程序设计

上传人:tian****1990 文档编号:81512878 上传时间:2019-02-21 格式:PPT 页数:97 大小:1.87MB
返回 下载 相关 举报
java实用程序设计(西电版)第3章java面向对象的程序设计_第1页
第1页 / 共97页
java实用程序设计(西电版)第3章java面向对象的程序设计_第2页
第2页 / 共97页
java实用程序设计(西电版)第3章java面向对象的程序设计_第3页
第3页 / 共97页
java实用程序设计(西电版)第3章java面向对象的程序设计_第4页
第4页 / 共97页
java实用程序设计(西电版)第3章java面向对象的程序设计_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《java实用程序设计(西电版)第3章java面向对象的程序设计》由会员分享,可在线阅读,更多相关《java实用程序设计(西电版)第3章java面向对象的程序设计(97页珍藏版)》请在金锄头文库上搜索。

1、,第 3 章 Java面向对象的程序设计,3.1 面向对象的基本思想 3.2 面向对象程序设计的基本概念 3.3 Java中的对象与类 3.4 构造方法与对象初始化 3.5 包与访问权限控制 3.6 Java中的继承 3.7 Java多态机制,3.1 面向对象的基本思想 1. 面向对象问题求解基本思想 所有编程语言都提供“抽象”方法。也可以说,使用一种编程语言所能解决的问题的复杂程度直接取决于抽象的种类及质量,这里的抽象种类指的是被抽象的对象是什么。早期的汇编语言是对底层机器的轻微抽象。后续发展起来的许多命令式语言(如FORTRAN、BASIC和C语言等)对汇编语言进行进一步的抽象。,2. 面

2、向对象问题求解方法 面向对象方法的特点就在于,在建立问题空间的问题模型和解空间的机器模型的过程中,都使用了“对象”这一概念,使得机器世界中的面向对象模型与现实世界中问题的存在形态非常接近,从而简化了两种模型之间的映射。,3. 面向对象程序设计的特征 Smalltalk语言的发明人Alan Kay曾经将面向对象程序设计方法的特征总结为以下5个方面: (1) 一切皆对象。 (2) 程序是一系列对象的组合,对象间通过消息传递进行联系。 (3) 每个对象都有自身内存空间,内存空间由其他对象构成。 (4) 每个对象都有一种类型(type)。 (5) 同一类型的所有对象都能够接收相同的消息。,3.2 面向

3、对象程序设计的基本概念 1. 对象、类与接口 3.1节已经介绍了对象实际上是问题空间中可以明确标识的实体,例如学生、汽车、手机等,这些实体在解空间中存在相应的抽象表示。面向对象程序设计中的对象是以现实世界的对象为模型构造的。每个对象都有自己的标识、状态和行为。,2. 封装与隐藏 对于支持大规模程序设计的通用编程语言来说,总会涉及程序的开发者与程序的使用者不重叠的情况。在C语言中,这种情况发生在函数库的开发时,而对于Java,类库的开发也存在类似的情况。我们将创建新数据类型的程序员称为“类开发者”,将使用这些数据类型的程序员称为“客户端程序员”。这一划分不是绝对的,最常见的情况是程序员在编程时既

4、使用了别人创建的类,又使用了自己创建的类。,封装的意义包含以下三个方面: (1) 模块化:不同对象代码间相对独立,对象可以在系统中方便移动; (2) 保证数据对象的一致性:通过隐藏对象变量和方法实现,防止绕过接口更改成员变量; (3) 易于维护:开发者可随意更改私有变量和私有方法,而不会影响调用对象接口的其他程序。,3. 继承与复用 复用是现代程序设计语言都应实现的功能。对于命令式语言,如C语言,复用的对象处于代码和函数的层面,而对于Java语言,复用的对象主要是已定义的类。为了达到复用类的目的,使用的方法主要有组合和继承两种。,图3-1 类的继承示例,4. 多态性 1) 编译时多态 编译时多

5、态通过方法重载(overloading)实现。方法重载是指在一个类中定义多个名称相同但参数不同的方法。参数不同指的是两方面的不同:参数类型不同或参数数量不同。 (1) 参数类型不同。以java.lang.Math类的max()方法为例,该方法包括如下版本: public static double Math.max(double a,double b); public static float Math.max(float a,float b); public static int Math.max(int a,int b); public static long Math.max(long

6、a,long b);,(2) 参数数量不同。以java.lang.String类的split()方法为例,该方法包括如下版本: public String split(String regex); public String split(String regex,int limit); 在程序中具体使用其中的哪个方法,是由编译器根据参数数量和类型决定的。虽然多个重载方法的参数列表必须不同,但它们的返回值、修饰符可以相同也可以不同。,2) 运行时多态 运行时多态是以继承性为基础的多态性,是在程序运行时动态产生的。有时,多态性也可以专指运行时多态。本节前面部分介绍的继承性主要描述父类与子类之间的关

7、系,而多态性还要求在这种关系的基础上,将一个对象当作它所在类的父类的对象来看待。这种将子类看做它的父类的过程称为向上转型(或上塑造型,upcasting)。“向上”的意思是从类继承层次(如图3-1)的子类(一般在较下方)向父类(一般在较上方)转型。,3.3 Java中的对象与类 1. 类的结构与创建 类的基本结构可以表示为如下的类声明格式:,类是创建对象的模板。通过类的构造方法可以创建对象。例如,在例3-1的main()方法中,通过new关键字调用Rectangle类的默认构造方法构造一个对象。对象创建与初始化的进一步介绍见第3.4 节。创建对象之后,通常会对对象的成员变量和方法进行访问。对对

8、象数据的访问和对对象方法的调用通过圆点操作符(.)来完成,该操作符也称为对象成员访问操作符,访问的一般格式形如: 对象引用变量.成员变量; 对象引用变量.成员方法名(实参列表);,2. 方法的参数传递与返回 方法是为了完成特定功能而组合在一起的一组语句。在其他编程语言中,方法称为过程(procedure)或函数(function)。Java中的方法一般分为构造方法和成员方法,声明方式分别见表3-1。我们首先抛开修饰符来看方法的一般组成要素。,在方法定义时,还有以下问题需要特别注意: (1) 在成员方法中,如果局部变量或形参的名称与类的成员变量冲突,那么类的成员变量会被隐藏,如果要将成员变量显露

9、出来,应在该方法中使用成员变量时加上关键字“this”。,(2) 方法的可变长参数列表。类型相同但个数可变的多个参数,可以通过语法“类型名 参数名”声明为方法的可变长参数,如例3-4中的“int points”。Java将可变长参数当作数组对待。即在进行方法调用时,可变长参数可接受的实参必须是一个数组或者一个实参序列,例如对ratingAverage()方法的第1次调用使用了一个匿名数组作为实参,而对该方法的第2次调用使用了5个整数的序列作为实参。在方法内部,参数名作为一个对数组的引用变量存在。,3. this关键字 实际上,this关键字一般只在方法内部使用,表示对“调用方法的那个对象”的引

10、用。这个引用一般只在实例成员方法中存在,在静态方法中则不存在。当一个对象的实例成员方法被调用时,虚拟机会为这个方法创建一个栈帧,并在栈帧中创建局部变量表,方法的每一个实参值都会有对应的局部变量作为存储空间。在这一过程中,虚拟机还会自动地在局部变量表中开辟一个局部变量,该变量能够存储对当前对象的引用,这一存在于栈帧的局部变量表中的引用变量用this表示。因此,在方法中,需要引用该方法所属类的当前对象时,可以直接用this。,3.4 构造方法与对象初始化 1. 构造方法的特点与默认构造方法 构造方法是一种特殊的方法,具有以下三个特点: (1) 构造方法的名称必须与所在类的名称相同。 (2) 构造方

11、法没有返回值,这与返回值为空(void)不同。 (3) 构造方法在创建一个对象时调用,调用时必须使用new关键字。,2. 对象成员的初始化 根据对构造方法调用的要求,对象的实例化可以通过“new 类名(参数列表)”完成。对象的实例化过程分为3个阶段:首先,为对象分配存储空间;其次,对对象的成员变量进行初始化;第三,返回对象的引用。,在实例化的第2阶段,对对象的成员变量的初始化又 分为多步完成。我们定义另一个类Rectangle2来说明这些 步骤,见例3-6,相应的初始化过程中的内存变化如图3-2 所示。,图3-2 对象成员变量初始化过程中的内存变化,综上所述,当我们希望对类中的引用类型成员变量

12、初始化为非null引用时,可以在代码中的以下位置进行: (1) 引用变量声明处进行显式初始化; (2) 在类的构造方法中; (3) 在一般方法中,且在使用对象之前,这种情况称为“惰性初始化”,如果程序不需要每次都生成对象,那么这种惰性初始化可以减少额外的开销; (4) 在实例初始化程序块中。,3.5 包与访问权限控制 1. 包与代码组织 包用于组织一系列相关的类和接口,它提供了类的命名空间的管理与访问控制。Java平台中的类和接口都是根据功能用包进行组织的。,在源代码中,可以使用package语句指定源代码中的所有类属于一个特定的包。包定义的一般格式为 package pkg1.pkg2.pk

13、g3;,在代码中使用一个类时,需要指明这个类是属于哪个包的。例如,当使用java.util包中的ArrayList类时,一种使用方法为 java.util.ArrayList list=new java.util.ArrayList();,当然,在使用类时总指明类所属的包是一种很繁琐的方法,如果包的路径很深,每一条语句就会显得很长。为此,Java提供了import关键字用于引入包成员或整个包。import语句的一般格式为 import pkg1.pkg2.pkg3 .(类名|*);,当程序使用到其他类中定义为static final的静态常量或定义为static的静态方法时,每次引用这些常量或

14、方法都用它们所属的类名。例如java.lang.Math类定义了静态常量PI和静态方法sin(),正常使用时例如: double d=Math.sin(Math.PI/2); 在J2SE 5.0之后,Java中还支持一种静态引入语句,能够引入一个类的单个静态成员或所有静态成员,具体语法 如下: import static 静态常量名|静态方法名|*;,2. 访问权限控制 对于类的成员变量和方法,存在public、protected、包访问权限、private四种访问权限。以下分别介绍这四种权限的异同。 (1) public访问权限(又称接口访问权限):所有类(包内或包外)均可访问该成员。 (2

15、) 包访问权限:当前包中所有的其他类均可访问该成员。,(3) private访问权限:除了包含该成员的类之外,其他类均无法访问该成员。,(4) protected访问权限(又称继承访问权限):protected权限是用于处理继承的,继承的基本思想我们已经在第3.2节进行了介绍,由于Java的继承机制在下节才具体介绍,读者可以先阅读下节的内容再回头看这一部分。,综上所述,可得如下的访问权限控制的一般规则。 (1) 一个类或接口C对另一个类或接口D可见,当且仅当以下条件之一成立: C是public的。 C和D处于同一个包中。,(2) 一个成员变量或方法R对另一个类或接口D可见,当且仅当以下条件之一成立: R是public的。 在C中声明的R是protected的,D与C相同或者D是C的子类。如果R不是static的,那么到R的符号引用就必须包含一个到T类的符号引用,其中T与D相同或者T是D的子类或父类(关于符号引用解析的相关内容可以参见附录2)。 在C中声明的R是protected的或包访问权限,并且C与D处于同一包中。 R是private的,且声明在类D中。,3.6 Java中的继承 1. 继承的一般用法 继承的核心语法是在类定义中的类体之前、类名之后使用“extends 父类名”来实现的,见第3.3节。当新类的定义使用了这一语法时,表

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号