Java 实用程序设计(西电版)第3章 Java面向对象的程序设计.ppt_第1页
Java 实用程序设计(西电版)第3章 Java面向对象的程序设计.ppt_第2页
Java 实用程序设计(西电版)第3章 Java面向对象的程序设计.ppt_第3页
Java 实用程序设计(西电版)第3章 Java面向对象的程序设计.ppt_第4页
Java 实用程序设计(西电版)第3章 Java面向对象的程序设计.ppt_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,第3章Java面向对象的程序设计,3.1面向对象的基本思想3.2面向对象程序设计的基本概念3.3Java中的对象与类3.4构造方法与对象初始化3.5包与访问权限控制3.6Java中的继承3.7Java多态机制,3.1面向对象的基本思想1.面向对象问题求解基本思想所有编程语言都提供“抽象”方法。也可以说,使用一种编程语言所能解决的问题的复杂程度直接取决于抽象的种类及质量,这里的抽象种类指的是被抽象的对象是什么。早期的汇编语言是对底层机器的轻微抽象。后续发展起来的许多命令式语言(如FORTRAN、BASIC和C语言等)对汇编语言进行进一步的抽象。,2.面向对象问题求解方法面向对象方法的特点就在于,在建立问题空间的问题模型和解空间的机器模型的过程中,都使用了“对象”这一概念,使得机器世界中的面向对象模型与现实世界中问题的存在形态非常接近,从而简化了两种模型之间的映射。,3.面向对象程序设计的特征Smalltalk语言的发明人AlanKay曾经将面向对象程序设计方法的特征总结为以下5个方面:(1)一切皆对象。(2)程序是一系列对象的组合,对象间通过消息传递进行联系。(3)每个对象都有自身内存空间,内存空间由其他对象构成。(4)每个对象都有一种类型(type)。(5)同一类型的所有对象都能够接收相同的消息。,3.2面向对象程序设计的基本概念1.对象、类与接口3.1节已经介绍了对象实际上是问题空间中可以明确标识的实体,例如学生、汽车、手机等,这些实体在解空间中存在相应的抽象表示。面向对象程序设计中的对象是以现实世界的对象为模型构造的。每个对象都有自己的标识、状态和行为。,2.封装与隐藏对于支持大规模程序设计的通用编程语言来说,总会涉及程序的开发者与程序的使用者不重叠的情况。在C语言中,这种情况发生在函数库的开发时,而对于Java,类库的开发也存在类似的情况。我们将创建新数据类型的程序员称为“类开发者”,将使用这些数据类型的程序员称为“客户端程序员”。这一划分不是绝对的,最常见的情况是程序员在编程时既使用了别人创建的类,又使用了自己创建的类。,封装的意义包含以下三个方面:(1)模块化:不同对象代码间相对独立,对象可以在系统中方便移动;(2)保证数据对象的一致性:通过隐藏对象变量和方法实现,防止绕过接口更改成员变量;(3)易于维护:开发者可随意更改私有变量和私有方法,而不会影响调用对象接口的其他程序。,3.继承与复用复用是现代程序设计语言都应实现的功能。对于命令式语言,如C语言,复用的对象处于代码和函数的层面,而对于Java语言,复用的对象主要是已定义的类。为了达到复用类的目的,使用的方法主要有组合和继承两种。,图3-1类的继承示例,4.多态性1)编译时多态编译时多态通过方法重载(overloading)实现。方法重载是指在一个类中定义多个名称相同但参数不同的方法。参数不同指的是两方面的不同:参数类型不同或参数数量不同。(1)参数类型不同。以java.lang.Math类的max()方法为例,该方法包括如下版本:publicstaticdoubleMath.max(doublea,doubleb);publicstaticfloatMath.max(floata,floatb);publicstaticintMath.max(inta,intb);publicstaticlongMath.max(longa,longb);,(2)参数数量不同。以java.lang.String类的split()方法为例,该方法包括如下版本:publicStringsplit(Stringregex);publicStringsplit(Stringregex,intlimit);在程序中具体使用其中的哪个方法,是由编译器根据参数数量和类型决定的。虽然多个重载方法的参数列表必须不同,但它们的返回值、修饰符可以相同也可以不同。,2)运行时多态运行时多态是以继承性为基础的多态性,是在程序运行时动态产生的。有时,多态性也可以专指运行时多态。本节前面部分介绍的继承性主要描述父类与子类之间的关系,而多态性还要求在这种关系的基础上,将一个对象当作它所在类的父类的对象来看待。这种将子类看做它的父类的过程称为向上转型(或上塑造型,upcasting)。“向上”的意思是从类继承层次(如图3-1)的子类(一般在较下方)向父类(一般在较上方)转型。,3.3Java中的对象与类1.类的结构与创建类的基本结构可以表示为如下的类声明格式:,类是创建对象的模板。通过类的构造方法可以创建对象。例如,在例3-1的main()方法中,通过new关键字调用Rectangle类的默认构造方法构造一个对象。对象创建与初始化的进一步介绍见第3.4节。创建对象之后,通常会对对象的成员变量和方法进行访问。对对象数据的访问和对对象方法的调用通过圆点操作符(.)来完成,该操作符也称为对象成员访问操作符,访问的一般格式形如:对象引用变量.成员变量;对象引用变量.成员方法名(实参列表);,2.方法的参数传递与返回方法是为了完成特定功能而组合在一起的一组语句。在其他编程语言中,方法称为过程(procedure)或函数(function)。Java中的方法一般分为构造方法和成员方法,声明方式分别见表3-1。我们首先抛开修饰符来看方法的一般组成要素。,在方法定义时,还有以下问题需要特别注意:(1)在成员方法中,如果局部变量或形参的名称与类的成员变量冲突,那么类的成员变量会被隐藏,如果要将成员变量显露出来,应在该方法中使用成员变量时加上关键字“this”。,(2)方法的可变长参数列表。类型相同但个数可变的多个参数,可以通过语法“类型名参数名”声明为方法的可变长参数,如例3-4中的“intpoints”。Java将可变长参数当作数组对待。即在进行方法调用时,可变长参数可接受的实参必须是一个数组或者一个实参序列,例如对ratingAverage()方法的第1次调用使用了一个匿名数组作为实参,而对该方法的第2次调用使用了5个整数的序列作为实参。在方法内部,参数名作为一个对数组的引用变量存在。,3.this关键字实际上,this关键字一般只在方法内部使用,表示对“调用方法的那个对象”的引用。这个引用一般只在实例成员方法中存在,在静态方法中则不存在。当一个对象的实例成员方法被调用时,虚拟机会为这个方法创建一个栈帧,并在栈帧中创建局部变量表,方法的每一个实参值都会有对应的局部变量作为存储空间。在这一过程中,虚拟机还会自动地在局部变量表中开辟一个局部变量,该变量能够存储对当前对象的引用,这一存在于栈帧的局部变量表中的引用变量用this表示。因此,在方法中,需要引用该方法所属类的当前对象时,可以直接用this。,3.4构造方法与对象初始化1.构造方法的特点与默认构造方法构造方法是一种特殊的方法,具有以下三个特点:(1)构造方法的名称必须与所在类的名称相同。(2)构造方法没有返回值,这与返回值为空(void)不同。(3)构造方法在创建一个对象时调用,调用时必须使用new关键字。,2.对象成员的初始化根据对构造方法调用的要求,对象的实例化可以通过“new类名(参数列表)”完成。对象的实例化过程分为3个阶段:首先,为对象分配存储空间;其次,对对象的成员变量进行初始化;第三,返回对象的引用。,在实例化的第2阶段,对对象的成员变量的初始化又分为多步完成。我们定义另一个类Rectangle2来说明这些步骤,见例3-6,相应的初始化过程中的内存变化如图3-2所示。,图3-2对象成员变量初始化过程中的内存变化,综上所述,当我们希望对类中的引用类型成员变量初始化为非null引用时,可以在代码中的以下位置进行:(1)引用变量声明处进行显式初始化;(2)在类的构造方法中;(3)在一般方法中,且在使用对象之前,这种情况称为“惰性初始化”,如果程序不需要每次都生成对象,那么这种惰性初始化可以减少额外的开销;(4)在实例初始化程序块中。,3.5包与访问权限控制1.包与代码组织包用于组织一系列相关的类和接口,它提供了类的命名空间的管理与访问控制。Java平台中的类和接口都是根据功能用包进行组织的。,在源代码中,可以使用package语句指定源代码中的所有类属于一个特定的包。包定义的一般格式为packagepkg1.pkg2.pkg3;,在代码中使用一个类时,需要指明这个类是属于哪个包的。例如,当使用java.util包中的ArrayList类时,一种使用方法为java.util.ArrayListlist=newjava.util.ArrayList();,当然,在使用类时总指明类所属的包是一种很繁琐的方法,如果包的路径很深,每一条语句就会显得很长。为此,Java提供了import关键字用于引入包成员或整个包。import语句的一般格式为importpkg1.pkg2.pkg3.(类名|*);,当程序使用到其他类中定义为staticfinal的静态常量或定义为static的静态方法时,每次引用这些常量或方法都用它们所属的类名。例如java.lang.Math类定义了静态常量PI和静态方法sin(),正常使用时例如:doubled=Math.sin(Math.PI/2);在J2SE5.0之后,Java中还支持一种静态引入语句,能够引入一个类的单个静态成员或所有静态成员,具体语法如下:importstatic静态常量名|静态方法名|*;,2.访问权限控制对于类的成员变量和方法,存在public、protected、包访问权限、private四种访问权限。以下分别介绍这四种权限的异同。(1)public访问权限(又称接口访问权限):所有类(包内或包外)均可访问该成员。(2)包访问权限:当前包中所有的其他类均可访问该成员。,(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.6Java中的继承1.继承的一般用法继承的核心语法是在类定义中的类体之前、类名之后使用“extends父类名”来实现的,见第3.3节。当新类的定义使用了这一语法时,表明新定义的类自动地获得了父类的所有成员变量和成员方法。也就是说,子类会包含父类的所有成员,而且复制了父类的接口。这样就保证了发送给父类对象的消息也能发送给子类对象。,2.继承与对象初始化综合上面几点,将子类对象的实例化过程的一般步骤归纳如下:(1)子类的构造方法调用父类的构造方法(通过显式的super()方法调用或编译器隐含插入的super()方法调用),这一过程递归地进行,直到根类Object的构造方法。在这一过程中,子类对象所需的所有内存空间被分配,所有成员都使用默认值初始化。,(2)从根类Object的构造方法开始,自顶向下地对每个类依次执行如下两步:显式初始化以及使用实例初始化程序块进行初始化。执行构造方法主体(不包括使用super调用父类构造方法)。,3.Object类java.lang.Object类是Java中所有类型的根类,Java中的所有类都是Object类的直接或间接子类。Object类中包含了所有对象(包括数组)都需要的状态和行为,例如对象比较、对象转换为字符串等。Object类的接口方法及其含义如表3-2所示。,3.7Java多态机制1.方法重载的进一步解释在第3.2节已经介绍了面向对象程序设计的两种多态形式。对于编译时多态,由编译器在编译时根据方法签名确定具体调用哪个被重载方法。,2.成员方法重写方法重写是实现运行时多态的基础,能够保证“对外一个接口”的实现。成员变量覆盖和重写方法的使用还需要注意以下几点:(1)无论是成员变量的覆盖还是成员方法的重写,前提都是成员能够在子类中被访问到。对于父类的私有成员变量和成员方法,如果在子类中存在声明相同的成员变量和签名、返回值均相同的成员方法,两个成员变量(成员方法)是完全独立的,不存在覆盖(重写)关系。,(2)变量调用方法时,调用的是子类中重写后的方法还是父类中的原方法,是由变量所指向的对象实例的类型决定的,而不是由变量本身的类型决定的。例如在例3-13中,Rectangle类的newDraw()方法依次用this引用和super引用调用draw()方法,两个引用分别指向的是Rectangle类型和Shape类型的对象,调用的也分别是两个类型各自的draw()方法。如果存在Shape类型的变量s,定义为Shapes=newRectangle();,(3)在J2SE5.0以后,对于子类方法和父类方法的返回类型做了一定程度的放宽。不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论