《Java程序设计课件(高晓黎)第4章类与对象.ppt》由会员分享,可在线阅读,更多相关《Java程序设计课件(高晓黎)第4章类与对象.ppt(79页珍藏版)》请在三一办公上搜索。
1、第4章 类与对象:构建Java程序的基石,目 录,面向对象程序设计,静态类与静态成员要素,Java修饰符,Java类的基本结构,构造方法,类的描述,重点与难点点拨,经典练习题,本章知识重点,构造方法,this关键字,类成员要素的访问控制修饰符,static修饰符与静态成员要素,面向对象程序设计的优越性,本章知识难点,Java类成员要素的访问控制修饰符,面向对象几大特征:抽象、封装、继承、多态,Java类的访问控制修饰符,类与对象的关系,面向对象的基本概念,对象(Object)是一个应用系统中用来描述客观事物的实体,是具有特定属性(数据)和行为(方法)的基本运行单位,是类的一个特定状态下的实例。
2、类(Class)是Java代码的基本组织模块,是用以描述一组具有共同属性和行为的对象的基本原型,是对这组对象的概括、归纳与抽象表达,它定义了本类对象所应拥有的状态属性集及操作这组属性的行为方法集。,面向对象的基本概念(续1),接口(Interface)是一种只包含常量与抽象方法的特殊的类,是Java语言用以实现类间多重继承功能的唯一手段。接口定义了一组特定功能的对外接口与规范,而并不真正实现这种功能,功能的实现留待给实现这一接口的各个类来完成,包(Package)是用来容纳一组相关类与接口的容器,是Java语言组织与管理类与接口的一种机制,类与对象的关系,类与对象之间的关系,类似于数据类型与变
3、量之间的关系;一个类可以生成无数个不同的对象,每个对象属性值不同,其状态也不同。,可以用计算机模型与计算机实体之间的关系来更形象地说明类与对象之间的关系:将冯诺依曼计算机模型看作计算机类,则不同品牌的计算机实体就对应为一个个的实例对象。,类与对象的关系示例,计算机模型与计算机实体之间的关系:,面向对象编程(OOP),从问题域客观存在的事物出发,将这些现实世界的物理实体抽象成概念世界的抽象数据类,再进一步将这种抽象数据类转换为计算机世界的类(Class);类刻画出实体所具有的状态信息与所能发挥的功能信息,是创建对象时所遵循的模板(Template)。对类进行实例化,就生成一个个的对象,对象对应于
4、各个具体事物,是程序运行过程中实际发挥作用的类的独立内存映像。借助于类与对象这两个面向对象程序中最基本的要素,按照尽可能符合人类自然思维的方式,来构造软件系统,这就是所谓的面向对象程序设计(OOP),OOP的逻辑过程,面向对象设计分析的完整过程如图所示:,面向对象的重要特征,面向对象具有以下几个重要特征:,抽象,封装与隐藏,继承,多态性,抽象,抽象(Abstraction):抽象是面向对象编程的起点,也是其最本质的特征之一。抽象的广义概念是这样定义的:从研究对象中提取与当前目标主题关系最密切的主要方面,而忽略掉与目标无关的那些方面或关系不大的细枝末节,从而更充分地注意与当前目标有关的方面,更明
5、确地突出主题,这就是抽象,抽象示例,下图阐述了如何由自然界众多的动物实体出发,经过抽象的处理过程,最终得到动物这一概念,封装,封装(Encapsulation):封装也可称为信息隐藏(Information Hiding),是通过对象的方法来访问与改变对象属性的一种机制。封装是面向对象的一个重要原则,其实现的核心是将类的属性与相关的操作捆绑起来,包装成不可分割的、独立的对象实体,将内部的数据与实现细节尽可能隐蔽起来,使外部用户不能直接操纵对象的内部信息,只能通过对象对外提供的施加有一定限制的访问接口来使用对象,封装示例,下图形象地说明了一个类的封装原理。类对数据与行为的封装是借助于不同级别的访
6、问修饰符来达到控制目的的,继承,继承(Inheritance):继承是指从已有的类中可以派生出若干个新类,已有类称为基类或父类,新类称为派生类或子类;子类将自动地获得基类的属性与方法,从而不需再重复定义这些属性与方法;当然子类还可以修改父类的方法或增加新的方法,从而使自己更适合特殊的需要。类之间的继承关系是现实世界中遗传关系的直接模拟,多态性,多态性(Polymorphism):是指允许不同类的对象对同一消息作出各自的响应,即以统一的风格处理已存在的数据及相关的操作。多态性语言具有灵活、抽象、行为共享、代码共享的优势,较好地解决了应用程序中方法同名的问题,OOP的优越性,从面向过程到面向对象是
7、程序设计技术的一个飞跃。人们之所以要采用面向对象的程序设计技术,其目的在于:,提升程序的开发与运行效率,提高代码的可重用性(或者称为复用性),按照与人类习惯思维方法一致的原则开发系统,OOP的优越性(续),提高程序的可靠性与可维护性 提高程序的可扩展性 增强程序的可控制性,总之,面向对象的程序设计,能够有效分解、降低问题的难度与复杂性,提高整个求解过程的可控制性、可监视性和可维护性,从而获得较高的开发效率与可靠效果,类的描述,类是Java语言面向对象编程的基本要素,用来定义对象的成员变量(数据域)与成员方法(功能接口),描述对象的状态与行为。Java程序将你要表达的实体或概念封装在类中,并由类
8、来创建诸多的实例对象。应用程序的功能便是由各个类的实例对象,通过调用各类方法来实现的,类的定义,修饰符public、说明了类的属性,abstract与final为互斥的两个修饰符,不能同时出现于一个类的声明中,类的声明用来指定该类的访问修饰符、类的名称、父类名称及实现接口等属性。声明类的完整形式为:,关键字class后面跟随类名,类名为用户定义的标识符,最好以意义完整且易于识别的英文单词或短句作为类名;类名应该能够描述出类的特征或作用,类名的第一个字母通常要大写,如果类名由多个单词组成,则每一单词的首字母一般都要大写。,类的定义(续1),关键字extends后面跟随着基类的名称关键字imple
9、ments后面跟随着类所实现的接口列表带有的项目为可选项目,只在必要时才出现类体是类功能实现的主体,是Java语句的集合 语句块界定符及标识出类体的有效范围,类的描述(续2),成员变量与成员方法为类的成员要素,简称为成员(Member),它们又分为静态/类的要素与对象/实例要素两类。构造方法是具有与类名相同名称的一种特殊方法,用来创建类的对象及对成员变量进行初始化。构造方法为可选项,当省略时,Java系统会按缺省方式定义空白的构造方法。,类定义示例,【例】建立一个公共的最终类日期类,其声明格式如下:public final class Date/类的声明语句/类体定义 private int
10、year;/年 private int month;/月 private int day;/日 public initDate(int y,int m,int d)/初始化年、月、日值的方法 public showDate()/显示当前日期值的方法,属性声明,public、protected与private为成员要素访问修饰符,用来限制成员变量或成员方法的访问范围,即哪些类或对象可以访问此成员要素 static用来指明成员要素为静态要素,又称类要素,以区别于对象要素。静态要素存在于类的定义区域中,属于类本身的成员,每个该类的对象共享这些要素,属性:成员变量(Member Variable)又称
11、为属性(Attribute)或数据域(Data Field),用来描述类对象的数据特征,属性声明(续1),final用于成员变量时,是作为定义最终变量即常量的关键字。这类常量的值不允许修改。transient(意为短暂的、瞬时的)为专门用于成员变量的修饰符,表明成员变量为临时变量 volatile(意为可变的、不稳定的)为专门用于成员变量的修饰符,声明一个被多个并发线程所共享的变量,属性声明(续2),成员变量名为用户自定义的标识符,一般为有意义的英文单词或单词组合;变量名的第一个字母小写,如果包含多个单词,则其他单词的首字母大写,一个定义语句可以声明一个成员变量,也可以声明多个同类型的成员变量
12、。不同类型的成员变量必须分别由不同的声明语句来定义,属性定义示例,【例】定义一个包访问属性的学生类Student,该类继承自Person父类,其属性包含学号、姓名、性别、出生日期、电子邮箱、手机号码、QQ号码、通讯地址等。类的定义代码如下:,class Student extends Person/extends关键字后面跟随基类名称 public String code;/学号 public String name;/姓名 public boolean sex;/性别 private Date birthDate;/出生日期 private String Email;/电子邮箱 privat
13、e String cellPhoneCode;/手机号码 private int QQCode;/QQ号码 public String address;/通讯地址/成员方法定义(略),类的成员方法,成员方法(Member Method)又称为功能接口(Function Interface),简称为方法(Method),是类对象与外界的接口,描述了类对象的行为方式,反应了对象的行为特征,特别是对属性进行操作的特征。成员方法对成员变量的操作主要体现在以下两个方面:,改变对象的属性,一般记为set方法,返回对象的属性,一般记为get方法,成员方法的定义,类中可定义多个方法,其定义格式如下:成员方法修
14、饰符(参数列表)throws/方法体定义/用于描绘方法行为的Java语句成员方法展开的定义格式为:public|protected|private static final|abstract native synchronized(参数列表)throws,成员方法的定义(续1),(参数列表)子句为成员方法的方法原型。,其中成员方法修饰符为修饰成员方法的一些关键字,习惯上,人们将属性的声明放在方法之前,但Java编译器对属性和方法的位置并无规定,二者出现的顺序可以任意进行组合穿插,在语法上都是有效的,成员方法的定义(续2),throws 子句称为声明抛出异常短语。如果定义的方法可能会产生自己不准
15、备处理或无法处理的异常(异常为一种严重级别不高的错误),应该在方法定义语句的throws子句中声明抛弃该类异常,使得该类异常对象从调用的栈中向上传播,直到有合适的方法捕获到它并给予处理为止,构造方法,构造方法(Constructor)又称为构造器,熟悉C+语言的人习惯上称之为构造函数。构造方法是类用来创建对象、初始化类的属性的一种特殊方法,它本身不属于类的成员方法。,Java中所有的类至少都要有一个构造方法,即使用户不明确地定义,系统也会为该类生成一个默认构造方法或缺省构造方法,这种缺省构造方法没有任何参数,且方法体为空。,构造方法的特殊性,构造方法没有返回类型,也不允许返回void类型。,构
16、造方法的方法名与类名完全相同(包括字母大小写),一个类可以包含多个重载的构造方法,使用这些重载的构造方法创建不同对象时,通过参数的不同来决定调用哪个构造方法。,构造方法不允许用户直接调用,只能通过new关键字在创建对象时由系统调用。,构造方法的特殊性(续),构造方法可以继承,即子类能够继承父类的构造方法,构造方法用于创建对象时由系统自动调用,一般定义为public访问修饰类型或默认的包访问类型,极少有需要定义为private或protected访问类型的场合,构造方法中可以使用super与this两个关键字来引用直接父类或自身对象,实例对象,类是用来描述对象数据与行为的模板与规范,是一个抽象的
17、概念,无法直接使用类来完成数据状态的改变与行为的实施,必须由一个个的对象来搭建应用程序的大厦。创建对象一般包括三个步骤:声明对象引用变量 建立对象实体 初始化对象,实例对象的引用,对象实体(Object)与对象引用变量(Object Reference Variable)是两个完全不同的概念。对象实体是类映射在内存中的一块物理区域,该区域中存储着类所定义的成员的当前状态。对象引用变量并不是对象本身,而是指向对象实体的符号标识,其值为一个32位的地址,该地址对应的存储空间为对象的物理存放区域一个对象可以被多个对象引用变量引用,但一个对象引用变量某一时该只能指向一个特定的对象,对象引用示例,例如下
18、面的两行代码:Cube cubeObj1,cubeObj2=null;cubeObj1=new Cube(50,40,30);第一个语句声明了两个立方体对象引用变量并初始化第二个变量的值为null,即cubeObj2变量不引用任何对象,它的“地址”为空值;第二个语句调用Cube类具有三个参数的构造方法,创建了一个实际的对象实体,并将对象的引用地址赋予对第一个变量,对象引用示例图,如同简单数据类型的变量之间可以相互赋值,对象引用变量之间也可相互赋值。对象变量之间的赋值,并不重新生成对象的拷贝,而只是将一个对象变量的引用复杂给另一个对象变量,从而使它们最终都指向同一个对象实体的内存地址。赋值语句c
19、ubeObj2=cubeObj1;将变量cubeObj1指向的对象引用赋值给了cubeObj2变量,使得两个对象变量都指向同一个对象,使用对象成员要素,对象创建后,就拥有了类的属性与方法的实例化副本,通过对象引用变量及点符号(.),便可以使用该对象,实现对对象属性与方法的访问,调用对象成员方法(续),调用对象成员方法的命令格式为:.方法名(参数列表),访问对象属性的命令格式为:.,this关键字,this是一种特殊的引用,它指向对象自身,表示对自身对象的一个引用。通过this这一引用,能够访问对象自身的成员数据,调用对象自身的成员方法。可以将this作为对象特殊的引用变量的名称,该变量可被访对
20、象自身使用。this关键字主要用于类的非静态成员方法(即实例方法)与构造方法中,而在静态方法(即类方法)中是不允许使用this关键字的。,this关键字的用途,构造方法中通过this引用同类的其他重载构造方法 在非静态成员方法中,通过this访问当前对象的成员变量或成员方法在构造方法中或非静态成员方法中,参数名或方法内的局部变量名与类的属性同名,为区分开来,需要在类的属性名前加上this.前缀 在非静态成员方法的参数中,包含有对当前对象引用的对象类型参数,此时需用this来传递这类参数,get与set方法,get方法返回特定属性的当前值它的方法原型可描述为:public get(),set方法
21、用来设置或修改某一属性的值它的方法原型可描述为:public void set(),get与set方法的好处,类能够将数据的内部实现隐藏起来,而提供给对外一个接口,从而避免用户直接操纵类的属性通过对get或set方法设置功能代码,类能够有效地实施成员变量的合法性检查通过get或set方法的组合,能够控制某些属性的只读或只写属性。如对于点类仅仅提供getX()方法,而不提供setX()方法,则x坐标属性就成为一个只读的属性,Java的修饰符,Java的修饰符(Modifier)是一组用来描述与刻画类、属性、构造方法与成员方法的系统关键字。主要包括访问权限控制修饰符与特征修饰符,特征修饰符是用来刻
22、画类、成员变量或成员方法特定特征的修饰符,针对不同的对象,特征修饰符的内容也各不相同,访问权限控制修饰符简称访问控制修饰符或访问修饰符,其作用是指明类、属性或方法是否可以被程序里的其他部分访问和调用,限定程序的哪些其他部分可以访问和调用它们,哪些不可以,Java修饰符列表,类的访问控制修饰符,公共类访问修饰符public一个类被声明为公共类,表明它可以被所有的其他的类所访问和引用,其他的类既包括本包的类,也包括其他包的类,缺省的类访问修饰符缺省的包访问属性规定该类只能被同一个包中的其他类或对象所访问和引用,而不允许被其他包中的类或对象所使用,类成员的访问控制修饰符,公共访问修饰符public,
23、保护访问修饰符protected,私有访问修饰符private,缺省的访问修饰符,类的特征修饰符,类的所有修饰符,成员变量的特征修饰符,成员变量的所有修饰符,成员方法的特征修饰符,成员方法的所有修饰符,缺省的修饰符,访问修饰符的控制范围,注:表示能够访问访问修饰符定义的类 表示能够继承访问修饰符定义的类,static修饰符与静态成员要素,类的成员要素可以被特征修饰符static声明为静态成员要素。静态成员要素属于整个类,能够通过类名来直接使用,而不需引用任何类的实例对象,因而静态成员要素又称为类成员要素,简称类成员(Class Member)或静态成员(Static Member)。静态成员要
24、素包括静态属性(Static Attribute)与静态方法(Static Method),它们先于类的任何实例对象创建之前而存在。,静态属性的特征,静态属性在类加载时自动创建,并被存放在类的内存体中的公共存储单元中,该类所有的对象共享同一个静态属性,存取到的是相同的值,静态属性可以通过类名直接访问,也可以由对象变量来引用,静态属性与非静态属性一样,可以使用public、private、final等修饰符,静态方法的特征,静态方法属于整个类,静态方法可通过类名直接访问或者由对象变量来引用,静态方法只能访问该类的静态属性,不能访问该类的实例变量,静态方法只能调用该类的其他静态方法,不能调用该类的
25、实例方法,静态方法的特征(续),静态方法不能以任何方式引用this与super关键字,静态方法不能被子类所覆盖,Java的应用程序必须有且只能有一个入口方法main(),是程序运行的起点,它存在于所有对象创建之前,因而main方法必须被定义为静态方法,但实例方法却可以访问该类的静态属性与静态方法,四类成员要素的性质与特征,四类成员要素的使用及访问方式表,Java应用程序的基本结构,package;import;import;定义用户类1定义类1的若干成员变量定义类1的若干构造方法 定义类1的若干成员方法定义用户类2定义类2的若干成员变量定义类2的若干构造方法 定义类2的若干成员方法定义用户类n
26、定义类n的若干成员变量定义类n的若干构造方法 定义类n的若干成员方法,成员方法,程序的基本构成单元是类,而成员方法又是类的主要组成部分,类的功能主要由成员方法来体现。成员方法简称方法,它定义了类的行为或动作,描述了对象可以执行的操作规范,规定了类与外界进行交互的接口,方法是一个有名字的、具有相对独立功能的程序模块。对象通过执行成员方法对传递过来的消息作出响应,从而完成特定的功能。方法之间可以互相调用,同一个方法可被一个或多个方法调用任意次,方法的声明,Java程序中,成员方法只能在类中声明。声明方法的格式如下:方法修饰符(参数列表)throws/方法头部声明/方法体定义 局部变量声明;语句序列
27、;return;,方法定义的两个部分,方法定义中包含两部分内容:方法头部声明与方法体定义,方法头部声明定义了方法的原型与性质。一般由方法名、参数列表、返回类型、方法修饰符和方法抛出异常五部分组成,方法体则定义了方法的具体内容与操作逻辑。方法体通常包含两类功能:一是对类的属性进行各种操作;二是与其他的类与对象进行消息传递操作,头部声明与方法体定义,方法头部声明定义了方法的原型与性质,方法体则定义了方法的具体内容与操作逻辑,方法体通常包含两类功能:一是对类的属性进行各种操作;二是与其他的类与对象进行消息传递操作,局部变量,类中的数据变量可分为成员变量(Member Variable)与局部变量(L
28、ocal Variable)两类 成员变量在类体中定义,其作用域为整个类。成员变量在类中定义的顺序与位置并不影响它的作用域范围 局部变量的作用域(Scope)又称为局部变量的作用范围,它是变量可被使用的代码块范围;作用域决定了变量的可见性与生存时间。局部变量作用域开始于它的声明,持续到包含该局部变量的程序段结束之处。不同类型的局部变量,其作用域也不尽相同,局部变量的三种类型,定义于方法体内的局部变量:这类局部变量仅能在方法内使用,其作用域局限于所定义的方法体。复合语句(或称为语句块)中定义的局部变量:这类局部变量只在复合语句中有效。方法的形参也称为局部变量:这类局部变量的作用域覆盖整个方法。方
29、法形参在方法被调用时被创建,并以调用方法传来的实参作为其初始值,当方法终止,调用结束时,这些形参自动被释放,其生命周期也随着终止。,局部变量的使用原则,局部变量不允许加Java修饰符,局部变量在使用前必须先声明,并赋初值,否则将出错,方法参数传递机制,方法的参数是方法的输入接口,是外界传递给方法进行加工操作的数据,方法的参数传递机制是指采用何种方式将实参传递给形参,参数传递类型,按引用传递(Call by reference):按引用传递就是将实参的引用(指向实参值的地址)复制一份赋值给方法的形参,方法对形参的操作实际就是对形参引用对象的操作,此时,引用对象的内容可以在被调用的方法中改变,但实
30、参中的引用值作为传递给形参的副本,并不能被改变。因此,在引用传递方式中,方法对于形参的改变会影响到实参的内容,按值传递(Call by value):按值传递就是将实参的值复制一份赋值给方法的形参,方法对形参的任何更改影响的只是实参的复制值,并不会对实参的真实值产生影响,引用的回顾,引用是一种数据类型,保存了类、接口、数组等对象在内存中的地址。引用类型既不是基本数据类型,也不同于类的实例对象。,不同的引用可以指向同一个对象,即一个对象可以有多个引用与之对应,方法调用方式分类,以表达式方式调用方法:对于有返回值的方法,将其作为表达式或表达式的一部分来调用。调用的形式为:方法名(实际参数表);,以
31、语句方式调用方法:对于返回值为空(void)的方法,一般以独立语句的方式进行调用。调用的形式为:方法名(实际参数表);,根据方法是否有返回值将调用方式分为两类:,递归方法的构建,递归算法的优缺点,递归算法的优点表现在:递归会使问题求解的思路简洁而清晰,实现递归算法的代码都非常精炼,递归算法的缺点是:由于递归运算要依赖于堆栈 结构,因而它的空间性能较差,运行速度要比迭代等其他算法为慢,简答练习题,this的意义与作用是什么?,什么是递归算法?如何用递归方法来编程解决问题?,编程练习题,有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子?试用递归方法编写程序。,编程练习题(续),定义一个复数类ComplexNumber,该类具有整数类型的两个属性a 和b,分别代表一个复数的实部与虚部,对应于形如a+bi形式的复数表达。该类具有重载的多个构造方法,用来初始化两个属性。定义一个复数运算类ComNumOperations,该类具有复数类引用类型的两个属性complex1与complex2,还具有构造方法及对两个复数进行加、减、乘、除四类运算的成员方法。在主类中创建一些复数类的实例对象,利用ComNumOperations的运算方法求取这些复数的运算结果并输出。,再 见,谢谢你的配合!,