第6章抽象封装与类Word格式文档下载.docx
- 文档编号:8299156
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:21
- 大小:32.93KB
第6章抽象封装与类Word格式文档下载.docx
《第6章抽象封装与类Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第6章抽象封装与类Word格式文档下载.docx(21页珍藏版)》请在冰点文库上搜索。
二.Java的类
❆1.Java类概念
2.类的定义与修饰
3.域
4.方法
1、Java类概念
v类(Class)和对象(Object)是面向对象程序设计方法中最核心的概念。
类是对某一类事物的描述(共性),是抽象的、概念上的定义;
对象则是实际存在的属该类事物的具体的个体(个性),因而也称为实例(Instance)。
v类是Java程序的基本组成要素
封装了一类对象的状态和方法,是该类对象的原型
vJava程序设计就是定义类的过程
Java程序中定义的类的数目和功能都是有限的
编程时还需要用到大量系统定义好的类,即Java类库中的类
v类的构成:
类头+类体
v类体由数据成员(属性、域)与函数成员封装而成。
Java语言把数据成员称为域变量、属性、成员变量等;
把函数成员称为成员方法,简称为成员方法。
v举例:
圆柱体类。
1.Java类概念
❆2.类的定义与修饰
(1)定义类
v定义类(声明类)
实际是定义类的静态属性和动态属性(方法)。
用户定义一个类实际上就是定义一个新的抽象数据类型。
v必须先定义类,然后才可利用所定义的类来声明相应的变量,并创建对象。
v定义类的语法结构
(1)定义类——实例
v实例:
圆柱体类的定义
(2)类的修饰符
vJava程序在定义类时,可在class之前增加若干类的修饰符,修饰限定所定义的类的特性
v类的修饰符分为访问控制符和非访问控制符两大类,有些类的修饰符也可以用来修饰类中的域或方法
v本节讨论类的非访问控制符
(2)类的修饰符——abstract
v抽象类是没有具体对象的概念类
v抽象类不能直接被实例化,一般作为其它类的超类
v举例
假设“鸟”是一个类,它可以派生出若干个子类如“鸽子”、“燕子”、“麻雀”、“天鹅”等
问题:
那么是否存在一只实实在在的鸟,它既不是鸽子,也不是燕子或麻雀,它不是任何一种具体种类的鸟,而仅仅是一只抽象的“鸟”呢?
v抽象类是其所有子类的公共属性的集合
使用该特性可提高程序开发和维护效率
v以“鸟”的概念为例
假设需要向别人描述“天鹅”是什么,通常都会这样说:
“天鹅是一种脖子长长,姿态优美的候鸟”
✓可见定义是建立在已知道什么是“鸟”的前提之上
◆只有在被进一步问及“鸟”是什么时,才会具体解释说:
“鸟是一种长着翅膀和羽毛的卵生动物”
◆而不会在一开始就把“天鹅”描述成“是一种脖子长长,姿态优美,长着翅膀和羽毛的卵生动物”
(2)类的修饰符——abstract举例
v已有两个类Circle和Rectangle,完成相关参数计算
v问题
假设有若干个Circle,以及若干个Rectangle,希望计算它们的总面积
✓直截了当的做法是将它们分别放到两个数组中,用两个循环,加上一个加法,这种做法不是最理想的
如果还有其它形状,triangle,ellipses等
✓上述方法显得“累赘”
我们希望有一种统一的表示,例如用一个数组shape[],接受所有的形状,然后用
for(i=0;
i<
shape.length;
i++)
area_total+=shape[i].area();
v解决方案
(3)类的修饰符——final
vfinal所修饰的类不可以有子类
v如果把一个应用中有继承关系的类组织成一棵倒长的树,所有类的父类是树根,每一个子类是一个分支,那么声明为final的类就只能是这棵树上的叶结点,它不可能再有分支子类
v被定义为final的类通常是一些有固定作用、用来完成某种标准功能的类
如Java系统定义好的用来实现网络功能的InetAddress、Socket等
v在Java程序中,当通过类名引用一个类或其对象时
实际真正引用的既可能是这个类或其对象本身
也可能是这个类的某个子类及子类的对象,即具有一定的不确定性
v将一个类定义为final,则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而保证引用这个类时所实现的功能的正确无误
补充:
abstract与final的使用注意点
vabstract和final修饰符不能同时修饰一个类
因为abstract类自身没有具体对象,需要派生出子类后再创建子类的对象
final类不可能有子类,这样abstractfinal类就无法使用,也就没有意义
v但是abstract和final可以各自与其他修饰符合用
例如一个类可以是publicabstract的,也可以是publicfinal的
✓这里的public是访问控制符
当一个以上的修饰符修饰类或类中的域、方法时,这些修饰符之间以空格分开,写在class关键字之前,修饰符之间的先后排列次序对类的性质没有影响
2.类的修饰符
❆3.域(成员变量)
(1)成员变量(域)
v类的成员变量描述了该类的内部信息,一个成员变量可以是简单变量,也可以是对象、数组等其他结构型数据。
v成员变量的格式:
[修饰符]变量类型变量名[=初值];
在定义类的成员变量时,可以同时赋初值,但对成员变量的操作只能放在方法中。
v域是类和对象的静态属性,可以是基本数据类型变量,也可以是其他类(系统类或自定义类)的对象
v定义域的操作就是说明变量或创建对象的操作
v与类相似,域(成员变量)也可以拥有若干修饰符,包括访问控制符和非访问控制符
v本节讨论域的非访问控制符
(2)成员变量修饰符——static
v用static修饰的域是仅属于类的静态域(staticfield)
v静态域本质特点:
它们是类的域,不属于任何一个类的具体对象
不保存在某个对象的内存区间中,而是保存在类的内存区域的公共存储单元
对于该类的任何一个具体对象而言,静态域是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值
任何一个类的对象去修改它时,也都是在对同一个内存单元进行操作
(2)成员变量修饰符——static举例
v程序定义对应200电话卡的类PhoneCard200
所有200电话卡的接入号码都是“200”,所以定义静态域connectNumber标志所有PhoneCard200对象的接入号码
使用200电话卡通话的附加费对每张电话卡也是一致的,所以定义类的静态域additoryFee
vTestStaticField.java(使用PhoneCard200类)
(3)成员变量修饰符——final
vfinal用来修饰常量
一个类的域如果被声明为final,它的值一旦给定,那么它的取值在程序的整个执行过程中都不会改变,如
staticfinalStringconnectNumber=″200″;
v定义final域时,若不是static的域,则必须且只能赋值一次,不能缺省,这种域的赋值的方式有两种
在定义变量时赋初始值
在每一个构造函数中进行赋值
v在定义final局部变量(方法中的变量)时,也必须且只能赋值一次
它的值可能不是常量,但它的取值在变量存在期间不会改变
v用final修饰符说明常量时,需要注意以下几点
需要说明常量的数据类型
需要同时指出常量的具体取值
由于所有类对象的常量成员,其数值都固定一致,为节省空间,常量通常声明为static,如常量值:
✓Integer.MAX_VALUE(表示最大整数)
✓Math.PI(表示圆周率)
v在定义staticfinal域时,若不给定初始值,则按默认值进行初始化
数值为0
boolean型为false
引用型为null
(4)成员变量修饰符——volatile
v被volatile修饰符所修饰的域
说明这个域可能同时被几个线程所控制和修改,即这个域不仅仅被当前程序所掌握
在运行过程中可能存在其他未知的程序操作来影响和改变该域的取值
在使用当中应该特别留意这些影响因素
vvolatile常用来修饰接受外部输入的域,如
表示当前时间的变量
✓将由系统的后台线程随时修改,以保证程序中取到的总是最新的当前的系统时间
✓因此可以把它定义为易失域
3.域(成员变量)
❆4.方法
(1)方法概述
v类的动态属性,标志类所具有的功能和操作
v用于将类和对象的数据封装在一起
v定义方法的目的
定义具有相对独立和常用功能的模块
使程序结构清晰,也利于模块在不同场合的重复利用环境的数据
v类的方法用来定义对类的成员变量进行的操作,是实现类内部功能的机制,同时也是类与外界进行交互的重要窗口。
(1)成员方法
v方法由方法头和方法体组成
v方法可以是有返回值也可以无返回值(void,主体中不用return语句)
v方法可带参数也可以不带参数。
(2)方法修饰符——abstract(抽象方法)
v抽象方法仅有方法头、没有具体方法体的实现,如
abstractvoidperformDial();
abstract方法只有方法头的声明,而用一个分号来代替方法体的定义
方法体的具体实现,留到各子类在各自的类定义中完成
vabstract方法隐藏具体的细节信息,使调用该方法的程序不必过分关注类及其子类内部的具体状况
v注意
所有抽象方法都必须存在于抽象类之中
但抽象类不一定只能拥有抽象方法,可以包含非抽象的方法
(3)方法修饰符——static(静态方法)
v用static修饰的方法,是属于整个类的类方法
v不用static限定的方法,是属于某个具体类对象或实例的方法
v声明一个方法为static至少以下重含义
调用这个方法时,应使用类名做前缀,而不是某一个具体的对象名
非static的方法是属于某个对象的方法,在这个对象创建时,对象的方法在内存中拥有自己专用的代码段
static的方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有
由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即,static方法只能处理static域
(3)方法修饰符——static(静态方法)
v在PhoneCard200中如果需要修改附加费,可以定义一个静态方法setAdditory()
不正确的用法
错误信息:
can’tmakeastaticreferencetononstaticvariable.
原因:
只有对象的方法可以访问对象的变量
v修改方法:
将变量改为类变量
(1)成员方法概述——举例
vPerfectNum.java
String.valueOf
String.valueOf():
由基本数据型态转换成String
vString.valueOf(booleanb):
将boolean变量b转换成字符串
vString.valueOf(charc):
将char变量c转换成字符串
vString.valueOf(char[]data):
将char数组data转成字符串
vString.valueOf(floatf):
将float变量f转换成字符串
vString.valueOf(inti):
将int变量i转换成字符串
vString.valueOf(Objectobj):
将obj对象转换成字符串,等于obj.toString()
v……
v用法如:
inti=10;
Stringstr=String.valueOf(i);
这时候str就会是"
10"
(4)方法修饰符——final(最终方法)
v最终方法:
功能和内部语句不能被更改的,即不能被当前类的子类重新定义的方法
v在面向对象程序设计中,子类可以把从父类那里继承来的某个方法改写并重新定义,形成与父类方法同名,但具体实现和功能却不同的新的类方法,该过程称为重载
若类的某个方法被final修饰符限定,则该类的子类不能重新定义与此方法同名的方法,而仅能使用从父类继承来的方法
好处:
可固定该方法所对应的具体操作,防止子类误对父类关键方法的重定义,保证程序安全性和正确性
(5)方法修饰符——native(本地方法)
v用来声明用其他语言书写方法体并具体实现的方法
其他语言包括C、C++、FORTRAN、汇编等
vnative方法的方法体使用其他语言在程序外部写成,所以native方法都没有方法体,而用一个分号代替
vJava里使用其他语言编写的模块作为类方法的目的
充分利用已经存在的程序功能模块、提高效率和避免重复工作
v由于native方法对应其他语言书写的模块是以非Java字节码的二进制代码形式嵌入Java程序的
这种二进制代码通常只能运行在编译生成它的平台之上,所以整个Java程序的跨平台性能将受到限制或破坏,除非保证native方法引入的代码也是跨不同平台的
(6)方法修饰符——synchronized(同步方法)
vsynchronized修饰符主要用于多线程共存的程序中的协调和同步
如果synchronized修饰的方法是一个类的方法(即static的方法),那么在被调用执行前,将把系统类Class中对应当前类的对象加锁
如果synchronized修饰的是一个对象的方法(未用static修饰的方法),则这个方法在被调用执行前,将把当前对象加锁
static与final小结
vfinal
final在方法之前,防止该方法被覆盖
final在类之前,表示该类不能被继承
final在变量之前,定义一个常量
vstatic
static在变量或方法之前,表明它们是属于类的
☞三、对象的创建与使用
1、对象的创建
v类名新建对象名=new构造函数();
v创建对象的步骤
(1)声明指向“由类所创建的对象”的变量;
(2)利用new创建新的对象,并指派给前面所声明的变量
创建圆柱体类Cylinder的对象
Cylindervolu;
//声明指向对象的变量volu
volu=newCylinder();
//利用new创建新的对象,并让变量
volu指向它
v创建对象,并让变量volu指向该对象
vCylindervolu=newCylinder();
volu变量是指向由Cylinder类所创建的对象,所以可将它视为“对象的名称”,简称对象。
事实上,volu只是对象的名称,它是指向对象实体的引用变量,而非对象本身。
在一个方法内部的变量必须进行初始化。
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化。
除基本类型之外的变量都是引用类型。
一个对象的生命周期:
创建->
使用->
销毁,对象完成工作后,将被销毁,所占用的资源将被系统回收。
2、对象的使用
v通过对象来引用对象成员的格式如下:
对象名.对象成员
如,volu.radius=2.8;
volu.height=5;
v如果引用的是成员方法,只要在成员方法名的圆括号内提供所需参数即可,如果方法不需要参数,则用空括号。
如:
volu.area()
v一个类多个对象,它们的成员变量分配在不同的内存,因此修改某一对象的成员变量时其他不受影响。
vApp6_1.java
3、在类定义内调用方法
v方法调用
场景一:
方法在类定义的外部被调用,在类声明之外用到成员名称时需指明对象;
;
场景二:
在类定义内部,方法之间可以相互调用,若在类内部使用类自己的成员时不必指明对象名
举例:
v在同一个类的定义里面,某一方法可以直接调用本类的其他方法而不需加对象名。
v若要强调是“对象本身的成员”的话,则可以在成员名前加this关键字,即“this.成员名”。
此时this即代表调用此成员的对象。
例如:
☞四、参数传递
四.参数传递
❆1、以变量为参数调用方法
2、以数组作为参数或返回值的方法调用
1、以变量为参数调用方法
v调用方法并传递参数时,参数其实就是方法的自变量,所以参数要放在方法的括号内来进行传递。
括号内的参数可以是数值型、字符串型,甚至是对象。
方法的参数属于局部变量。
1、以变量为参数调用方法——举例1
vApp6_4.java
v若在通过方法调用,将外部传入的参数赋值给类的成员变量,方法的形式参数与类的成员变量同名时,如何处理?
1、以变量为参数调用方法——举例2
1、以变量为参数调用方法
❆2、以数组作为参数或返回值的方法调用
方法的参数传递与返回
v调用对象方法时,要传递参数
在传递参数时,Java是值传递,即,在调用一个方法时,将表达式的值复制给形式参数
对于引用型变量,传递的值是引用值(可以理解为内存地址),因此方法中对数据的操作可以改变对象的属性
v方法的返回
返回基本类型
返回引用类型,就可以存取对象实体
(1)以数组为参数调用方法
v当参数是基本数据类型时,采用传值方式调用;
当参数是引用型的变量时,则是传址方式调用。
v传递数组
指明参数是一个数组,实参只给出数组名
v返回值为数组类型的方法。
若返回一个一维整型数组,则方法前加int[]。
vApp6_5.java:
以一维数组为参数的方法调用,求若干数的最小值。
(2)返回值为数组类型的方法
v将一个矩阵转置后输出。
☞五、匿名对象
五、匿名对象
v以当一个对象被创建之后,在调用该对象的方法时,也可以不定义对象的引用变量,而直接调用这个对象的方法,这样的对象叫做匿名对象。
v例如:
Cylindervolu=newCylinder();
volu.SetCylinder(2.5,5,3.14);
若改写为:
newCylinder().SetCylinder(2.5,5,3.14);
则Cylinder()就是匿名对象。
v使用匿名对象的两种情况:
如果一个对象只需要进行一次方法调用;
将匿名对象做为实参传递给一个方法调用。
v例:
一个程序中有一个getSomeOne方法要接收一个MyClass类对象作为参数,方法的定义如下:
PublicstaticvoidgetSomeOne(MyClassc)
{
……
}
v可以用下面的语句调用这个方法。
getSomeOne(newMyClass());
编程题
v找出4*5矩阵中值最小和最大的元素,并分别输出其值及所在的行号和列号。
v产生0~100之间8个随机整数,并利用冒泡排序法将其升序排序后输出。
v思想:
每次比较相邻的数,若次序不对,交换次序。
冒泡排序实例
v从键盘输入一个字符串和一个字符,从该字符串中删除给定的字符。
v编程统计用户从键盘输入的字符串中所包含的字母、数字和其他字符的个数。
v将用户从键盘输入的每行数据都显示输出,直到输入“exit”字符串,程序运行结束
拓展:
成员变量与局部变量
v成员变量:
在类中定义的变量
v局部变量:
在方法中定义的变量
v区别:
从语法形式看
✓成员变量属于类,局部变量是指方法中定义的变量或者参数;
✓成员变量可以被访问修饰符、static等修饰,而局部变量则不能被他们所修饰;
✓共同点:
都可以被final修饰
从在内存中的存储
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 抽象 封装
![提示](https://static.bingdoc.com/images/bang_tan.gif)