第4章类与对象-构建Java程序的基石_第1页
第4章类与对象-构建Java程序的基石_第2页
第4章类与对象-构建Java程序的基石_第3页
第4章类与对象-构建Java程序的基石_第4页
第4章类与对象-构建Java程序的基石_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

第四章类与对象:构建Java程序的基石

目录

面向对象程序设计静态类与静态成员要素

Java修饰符Java程序的基本结构

构造方法类的描述

重点与难点点拨经典练习题本章知识重点3132构造方法33this关键字34类成员要素的访问控制修饰符static修饰符与静态成员要素35面向对象程序设计的优越性本章知识难点33Java类成员要素的访问控制修饰符343132面向对象几大特征:抽象、封装、继承、多态Java类的访问控制修饰符

类与对象的关系面向对象的基本概念对象(Object)是一个应用系统中用来描述客观事物的实体,是具有特定属性(数据)和行为(方法)的基本运行单位,是类的一个特定状态下的实例。类(Class)是Java代码的基本组织模块,是用以描述一组具有共同属性和行为的对象的基本原型,是对这组对象的概括、归纳与抽象表达,它定义了本类对象所应拥有的状态属性集及操作这组属性的行为方法集。3132面向对象的基本概念(续1)接口(Interface)是一种只包含常量与抽象方法的特殊的类,是Java语言用以实现类间多重继承功能的唯一手段。接口定义了一组特定功能的对外接口与规范,而并不真正实现这种功能,功能的实现留待给实现这一接口的各个类来完成

34包(Package)是用来容纳一组相关类与接口的容器,是Java语言组织与管理类与接口的一种机制

33类与对象的关系类与对象之间的关系,类似于数据类型与变量之间的关系;一个类可以生成无数个不同的对象,每个对象属性值不同,其状态也不同。可以用计算机模型与计算机实体之间的关系来更形象地说明类与对象之间的关系:将冯·诺依曼计算机模型看作计算机类,则不同品牌的计算机实体就对应为一个个的实例对象。类与对象的关系示例计算机模型与计算机实体之间的关系:面向对象编程(OOP)

从问题域客观存在的事物出发,将这些现实世界的物理实体抽象成概念世界的抽象数据类,再进一步将这种抽象数据类转换为计算机世界的类(Class);类刻画出实体所具有的状态信息与所能发挥的功能信息,是创建对象时所遵循的模板(Template)。对类进行实例化,就生成一个个的对象,对象对应于各个具体事物,是程序运行过程中实际发挥作用的类的独立内存映像。借助于类与对象这两个面向对象程序中最基本的要素,按照尽可能符合人类自然思维的方式,来构造软件系统,这就是所谓的面向对象程序设计(OOP)

OOP的逻辑过程面向对象设计分析的完整过程如图所示:现实域抽象抽象类对象实例化映射抽象数据类物理实体逻辑实现概念域计算机世界面向对象的重要特征

面向对象具有以下几个重要特征:抽象封装与隐藏继承多态性

33313234抽象抽象(Abstraction):抽象是面向对象编程的起点,也是其最本质的特征之一。抽象的广义概念是这样定义的:从研究对象中提取与当前目标主题关系最密切的主要方面,而忽略掉与目标无关的那些方面或关系不大的细枝末节,从而更充分地注意与当前目标有关的方面,更明确地突出主题,这就是抽象抽象示例下图阐述了如何由自然界众多的动物实体出发,经过抽象的处理过程,最终得到动物这一概念封装封装(Encapsulation):封装也可称为信息隐藏(InformationHiding),是通过对象的方法来访问与改变对象属性的一种机制。封装是面向对象的一个重要原则,其实现的核心是将类的属性与相关的操作捆绑起来,包装成不可分割的、独立的对象实体,将内部的数据与实现细节尽可能隐蔽起来,使外部用户不能直接操纵对象的内部信息,只能通过对象对外提供的施加有一定限制的访问接口来使用对象封装示例下图形象地说明了一个类的封装原理。类对数据与行为的封装是借助于不同级别的访问修饰符来达到控制目的的继承继承(Inheritance):继承是指从已有的类中可以派生出若干个新类,已有类称为基类或父类,新类称为派生类或子类;子类将自动地获得基类的属性与方法,从而不需再重复定义这些属性与方法;当然子类还可以修改父类的方法或增加新的方法,从而使自己更适合特殊的需要。类之间的继承关系是现实世界中遗传关系的直接模拟多态性多态性(Polymorphism):是指允许不同类的对象对同一消息作出各自的响应,即以统一的风格处理已存在的数据及相关的操作。多态性语言具有灵活、抽象、行为共享、代码共享的优势,较好地解决了应用程序中方法同名的问题

OOP的优越性从面向过程到面向对象是程序设计技术的一个飞跃。人们之所以要采用面向对象的程序设计技术,其目的在于:

提升程序的开发与运行效率提高代码的可重用性(或者称为复用性)按照与人类习惯思维方法一致的原则开发系统OOP的优越性(续)提高程序的可靠性与可维护性

提高程序的可扩展性增强程序的可控制性总之,面向对象的程序设计,能够有效分解、降低问题的难度与复杂性,提高整个求解过程的可控制性、可监视性和可维护性,从而获得较高的开发效率与可靠效果类的描述类是Java语言面向对象编程的基本要素,用来定义对象的成员变量(数据域)与成员方法(功能接口),描述对象的状态与行为。Java程序将你要表达的实体或概念封装在类中,并由类来创建诸多的实例对象。应用程序的功能便是由各个类的实例对象,通过调用各类方法来实现的类的定义

修饰符public、说明了类的属性,abstract与final为互斥的两个修饰符,不能同时出现于一个类的声明中类的声明用来指定该类的访问修饰符、类的名称、父类名称及实现接口等属性。声明类的完整形式为:关键字class后面跟随类名,类名为用户定义的标识符,最好以意义完整且易于识别的英文单词或短句作为类名;类名应该能够描述出类的特征或作用,类名的第一个字母通常要大写,如果类名由多个单词组成,则每一单词的首字母一般都要大写。类的定义(续1)关键字extends后面跟随着基类的名称关键字implements后面跟随着类所实现的接口列表带有[]的项目为可选项目,只在必要时才出现类体是类功能实现的主体,是Java语句的集合

语句块界定符{及}标识出类体的有效范围类的描述(续2)成员变量与成员方法为类的成员要素,简称为成员(Member),它们又分为静态/类的要素与对象/实例要素两类。

构造方法是具有与类名相同名称的一种特殊方法,用来创建类的对象及对成员变量进行初始化。构造方法为可选项,当省略时,Java系统会按缺省方式定义空白的构造方法。类定义示例【例】建立一个公共的最终类—日期类,其声明格式如下:publicfinalclassDate//类的声明语句{//类体定义

privateintyear;//年

privateintmonth;//月

privateintday;//日

publicinitDate(int

y,int

m,intd){……}//初始化年、月、日值的方法

publicshowDate(){……}//显示当前日期值的方法}属性声明public、protected与private为成员要素访问修饰符,用来限制成员变量或成员方法的访问范围,即哪些类或对象可以访问此成员要素static用来指明成员要素为静态要素,又称类要素,以区别于对象要素。静态要素存在于类的定义区域中,属于类本身的成员,每个该类的对象共享这些要素

属性:成员变量(MemberVariable)又称为属性(Attribute)或数据域(DataField),用来描述类对象的数据特征属性声明(续1)final用于成员变量时,是作为定义最终变量即常量的关键字。这类常量的值不允许修改。transient(意为短暂的、瞬时的)为专门用于成员变量的修饰符,表明成员变量为临时变量

volatile(意为可变的、不稳定的)为专门用于成员变量的修饰符,声明一个被多个并发线程所共享的变量属性声明(续2)成员变量名为用户自定义的标识符,一般为有意义的英文单词或单词组合;变量名的第一个字母小写,如果包含多个单词,则其他单词的首字母大写一个定义语句可以声明一个成员变量,也可以声明多个同类型的成员变量。不同类型的成员变量必须分别由不同的声明语句来定义属性定义示例【例】定义一个包访问属性的学生类Student,该类继承自Person父类,其属性包含学号、姓名、性别、出生日期、电子邮箱、手机号码、QQ号码、通讯地址等。类的定义代码如下:classStudentextendsPerson//extends关键字后面跟随基类名称{publicStringcode;//学号

publicStringname;//姓名

publicbooleansex;//性别

privateDatebirthDate;//出生日期

privateStringEmail;//电子邮箱

privateStringcellPhoneCode;//手机号码

privateint

QQCode;//QQ号码

publicStringaddress;//通讯地址……//成员方法定义(略)}类的成员方法成员方法(MemberMethod)又称为功能接口(FunctionInterface),简称为方法(Method),是类对象与外界的接口,描述了类对象的行为方式,反应了对象的行为特征,特别是对属性进行操作的特征。成员方法对成员变量的操作主要体现在以下两个方面:改变对象的属性,一般记为set方法返回对象的属性,一般记为get方法成员方法的定义类中可定义多个方法,其定义格式如下:[成员方法修饰符]<方法返回类型><方法名>([参数列表])[throws<异常列表>]{//方法体定义

……//用于描绘方法行为的Java语句}成员方法展开的定义格式为:[public|protected|private][static][final|abstract][native][synchronized]<方法的返回类型><方法名>([参数列表])[throws<异常列表>]{……}成员方法的定义(续1)<方法的返回类型><方法名>([参数列表])子句为成员方法的方法原型。其中成员方法修饰符为修饰成员方法的一些关键字习惯上,人们将属性的声明放在方法之前,但Java编译器对属性和方法的位置并无规定,二者出现的顺序可以任意进行组合穿插,在语法上都是有效的333132成员方法的定义(续2)throws<异常列表>子句称为声明抛出异常短语。如果定义的方法可能会产生自己不准备处理或无法处理的异常(异常为一种严重级别不高的错误),应该在方法定义语句的throws子句中声明抛弃该类异常,使得该类异常对象从调用的栈中向上传播,直到有合适的方法捕获到它并给予处理为止34构造方法构造方法(Constructor)又称为构造器,熟悉C++语言的人习惯上称之为构造函数。构造方法是类用来创建对象、初始化类的属性的一种特殊方法,它本身不属于类的成员方法。Java中所有的类至少都要有一个构造方法,即使用户不明确地定义,系统也会为该类生成一个默认构造方法或缺省构造方法,这种缺省构造方法没有任何参数,且方法体为空。构造方法的特殊性构造方法没有返回类型,也不允许返回void类型。构造方法的方法名与类名完全相同(包括字母大小写)一个类可以包含多个重载的构造方法,使用这些重载的构造方法创建不同对象时,通过参数的不同来决定调用哪个构造方法。构造方法不允许用户直接调用,只能通过new关键字在创建对象时由系统调用。33343132构造方法的特殊性(续)构造方法可以继承,即子类能够继承父类的构造方法构造方法用于创建对象时由系统自动调用,一般定义为public访问修饰类型或默认的包访问类型,极少有需要定义为private或protected访问类型的场合构造方法中可以使用super与this两个关键字来引用直接父类或自身对象353637实例对象类是用来描述对象数据与行为的模板与规范,是一个抽象的概念,无法直接使用类来完成数据状态的改变与行为的实施,必须由一个个的对象来搭建应用程序的大厦。创建对象一般包括三个步骤:

声明对象引用变量建立对象实体初始化对象

实例对象的引用对象实体(Object)与对象引用变量(ObjectReferenceVariable)是两个完全不同的概念。对象实体是类映射在内存中的一块物理区域,该区域中存储着类所定义的成员的当前状态。对象引用变量并不是对象本身,而是指向对象实体的符号标识,其值为一个32位的地址,该地址对应的存储空间为对象的物理存放区域一个对象可以被多个对象引用变量引用,但一个对象引用变量某一时该只能指向一个特定的对象对象引用示例例如下面的两行代码:CubecubeObj1,cubeObj2=null;cubeObj1=newCube(50,40,30);第一个语句声明了两个立方体对象引用变量并初始化第二个变量的值为null,即cubeObj2变量不引用任何对象,它的“地址”为空值;第二个语句调用Cube类具有三个参数的构造方法,创建了一个实际的对象实体,并将对象的引用地址赋予对第一个变量对象引用示例图

如同简单数据类型的变量之间可以相互赋值,对象引用变量之间也可相互赋值。对象变量之间的赋值,并不重新生成对象的拷贝,而只是将一个对象变量的引用复杂给另一个对象变量,从而使它们最终都指向同一个对象实体的内存地址。赋值语句cubeObj2=cubeObj1;将变量cubeObj1指向的对象引用赋值给了cubeObj2变量,使得两个对象变量都指向同一个对象使用对象成员要素对象创建后,就拥有了类的属性与方法的实例化副本,通过对象引用变量及点符号(.),便可以使用该对象,实现对对象属性与方法的访问调用对象成员方法(续)调用对象成员方法的命令格式为:<对象引用变量>.方法名([参数列表])访问对象属性的命令格式为:<对象引用变量>.<属性名>this关键字this是一种特殊的引用,它指向对象自身,表示对自身对象的一个引用。通过this这一引用,能够访问对象自身的成员数据,调用对象自身的成员方法。可以将this作为对象特殊的引用变量的名称,该变量可被访对象自身使用。this关键字主要用于类的非静态成员方法(即实例方法)与构造方法中,而在静态方法(即类方法)中是不允许使用this关键字的。this关键字的用途构造方法中通过this引用同类的其他重载构造方法在非静态成员方法中,通过this访问当前对象的成员变量或成员方法在构造方法中或非静态成员方法中,参数名或方法内的局部变量名与类的属性同名,为区分开来,需要在类的属性名前加上this.前缀

在非静态成员方法的参数中,包含有对当前对象引用的对象类型参数,此时需用this来传递这类参数get与set方法get方法返回特定属性的当前值它的方法原型可描述为:

public<反回的数据类型>get<属性名称>()set方法用来设置或修改某一属性的值它的方法原型可描述为:publicvoidset<属性名称>(<属性的数据类型><参数>)get与set方法的好处类能够将数据的内部实现隐藏起来,而提供给对外一个接口,从而避免用户直接操纵类的属性通过对get或set方法设置功能代码,类能够有效地实施成员变量的合法性检查通过get或set方法的组合,能够控制某些属性的只读或只写属性。如对于点类仅仅提供getX()方法,而不提供setX()方法,则x坐标属性就成为一个只读的属性333132Java的修饰符Java的修饰符(Modifier)是一组用来描述与刻画类、属性、构造方法与成员方法的系统关键字。主要包括访问权限控制修饰符与特征修饰符特征修饰符是用来刻画类、成员变量或成员方法特定特征的修饰符,针对不同的对象,特征修饰符的内容也各不相同访问权限控制修饰符简称访问控制修饰符或访问修饰符,其作用是指明类、属性或方法是否可以被程序里的其他部分访问和调用,限定程序的哪些其他部分可以访问和调用它们,哪些不可以Java修饰符列表Java的修饰符类成员变量成员方法构造方法访问修饰符public√√√√protected×√√√private×√√√缺省(package)√√√√特征修饰符static×√√×abstract√×√×final√√√×transient×√××volatile×√××native××√×synchronized××√×类的访问控制修饰符公共类访问修饰符public一个类被声明为公共类,表明它可以被所有的其他的类所访问和引用,其他的类既包括本包的类,也包括其他包的类缺省的类访问修饰符缺省的包访问属性规定该类只能被同一个包中的其他类或对象所访问和引用,而不允许被其他包中的类或对象所使用类成员的访问控制修饰符31公共访问修饰符public

32保护访问修饰符protected

33私有访问修饰符private34缺省的访问修饰符类的特征修饰符

abstract特征修饰符final特征修饰符类的所有修饰符成员变量的特征修饰符

static与特征修饰符final特征修饰符transient属性修饰符volatile属性修饰符成员变量的所有修饰符成员方法的特征修饰符

static特征修饰符abstract特征修饰符final特征修饰符synchronized修饰符native修饰符成员方法的所有修饰符缺省的修饰符访问属性访问修饰符关键字本类相同包中的不同类(包含子类)不同包中的子类不同包中的非子类公共访问属性public✍✍♂✍♂✍♂保护访问属性protected✍✍♂♂私有访问属性private✍缺省的包访问属性无✍✍♂访问修饰符的控制范围注:✍表示能够访问访问修饰符定义的类♂表示能够继承访问修饰符定义的类static修饰符与静态成员要素类的成员要素可以被特征修饰符static声明为静态成员要素。静态成员要素属于整个类,能够通过类名来直接使用,而不需引用任何类的实例对象,因而静态成员要素又称为类成员要素,简称类成员(ClassMember)或静态成员(StaticMember)。静态成员要素包括静态属性(StaticAttribute)与静态方法(StaticMethod),它们先于类的任何实例对象创建之前而存在。静态属性的特征静态属性在类加载时自动创建,并被存放在类的内存体中的公共存储单元中该类所有的对象共享同一个静态属性,存取到的是相同的值静态属性可以通过类名直接访问,也可以由对象变量来引用静态属性与非静态属性一样,可以使用public、private、final等修饰符静态方法的特征31静态方法属于整个类

32静态方法可通过类名直接访问或者由对象变量来引用

33静态方法只能访问该类的静态属性,不能访问该类的实例变量

34静态方法只能调用该类的其他静态方法,不能调用该类的实例方法

静态方法的特征(续)静态方法不能以任何方式引用this与super关键字静态方法不能被子类所覆盖Java的应用程序必须有且只能有一个入口方法main(),是程序运行的起点,它存在于所有对象创建之前,因而main方法必须被定义为静态方法363738但实例方法却可以访问该类的静态属性与静态方法

35四类成员要素的性质与特征四类成员要素的使用及访问方式表成员要素类型存在时机通过类名使用由对象引用能否在静态方法中访问能否在实例方法中访问静态/类属性对象创建前已存在√√√√实例/对象属性对象创建后才存在×√×√静态/类方法对象创建前已存在√√√√实例/对象方法对象创建后才存在×√×√Java应用程序的基本结构

[package<声明的包名称>;][import<Java类库1>;][……][import<Java类库m>;]定义用户类1{定义类1的若干成员变量定义类1的若干构造方法定义类1的若干成员方法}定义用户类2{定义类2的若干成员变量定义类2的若干构造方法定义类2的若干成员方法}……定义用户类n{定义类n的若干成员变量定义类n的若干构造方法定义类n的若干成员方法}成员方法程序的基本构成单元是类,而成员方法又是类的主要组成部分,类的功能主要由成员方法来体现。成员方法简称方法,它定义了类的行为或动作,描述了对象可以执行的操作规范,规定了类与外界进行交互的接口方法是一个有名字的、具有相对独立功能的程序模块。对象通过执行成员方法对传递过来的消息作出响应,从而完成特定的功能。方法之间可以互相调用,同一个方法可被一个或多个方法调用任意次方法的声明Java程序中,成员方法只能在类中声明。声明方法的格式如下:[方法修饰符]<返回值类型><方法名>([参数列表])throws<异常列表>//方法头部声明

{//方法体定义局部变量声明;语句序列;

[return<表达式>;]}方法定义的两个部分方法定义中包含两部分内容:方法头部声明与方法体定义方法头部声明定义了方法的原型与性质。一般由方法名、参数列表、返回类型、方法修饰符和方法抛出异常五部分组成方法体则定义了方法的具体内容与操作逻辑。方法体通常包含两类功能:一是对类的属性进行各种操作;二是与其他的类与对象进行消息传递操作头部声明与方法体定义31方法头部声明定义了方法的原型与性质32方法体则定义了方法的具体内容与操作逻辑33方法体通常包含两类功能:一是对类的属性进行各种操作;二是与其他的类与对象进行消息传递操作

局部变量类中的数据变量可分为成员变量(MemberVariable)与局部变量(LocalVariable)两类成员变量在类体中定义,其作用域为整个类。成员变量在类中定义的顺序与位置并不影响它的作用域范围局部变量的作用域(Scope)又称为局部变量的作用范围,它是变量可被使用的代码块范围;作用域决定了变量的可见性与生存时间。局部变量作用域开始于它的声明,持续到包含该局部变量的程序段结束之处。不同类型的局部变量,其作用域也不尽相同3231局部变量的三种类型定义于方法体内的局部变量:这类局部变量仅能在方法内使用,其作用域局限于所定义的方法体。复合语句(或称为语句块)中定义的局部变量:这类局部变量只在复合语句中有效。方法的形参也称为局部变量:这类局部变量的作用域覆盖整个方法。方法形参在方法被调用时被创建,并以调用方法传来的实参作为其初始值,当方法终止,调用结束时,这些形参自动被释放,其生命周期也随着终止。333132局部变量的使用原则局部变量不允许加Java修饰符局部变量在使用前必须先声明,并赋初值,否则将出错方法参数传递机制方法的参数是方法的输入接口,是外界传递

温馨提示

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

评论

0/150

提交评论