抽象封装与类_第1页
抽象封装与类_第2页
抽象封装与类_第3页
抽象封装与类_第4页
抽象封装与类_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

抽象封装与类第1页,共75页,2023年,2月20日,星期一北京邮电大学24.1抽象与封装一、抽象抽象是科学研究中经常使用的一种方法,即去除掉被研究对象中与主旨无关的次要部分,或是暂时不予考虑的部分,而仅仅抽取出与研究工作有关的实质性的内容加以考察。在计算机技术的软件开发方法中所使用的抽象有两类:一类是过程抽象,另一类是数据抽象。

第2页,共75页,2023年,2月20日,星期一北京邮电大学3过程抽象将整个系统的功能划分为若干部分,强调功能完成的过程和步骤。面向过程的软件开发方法采用的就是这种抽象方法。使用过程抽象有利于控制、降低整个程序的复杂度,但是这种方法本身自由度较大,难于规范化和标准化,操作起来有一定难度,在质量上不易保证。数据抽象是与过程抽象不同的抽象方法,它把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含了数据,也包含了针对这些数据的授权操作,是相对于过程抽象更为严格、也更为合理的抽象方法。第3页,共75页,2023年,2月20日,星期一北京邮电大学4面向对象的软件开发方法的主要特点之一,就是采用了数据抽象的方法来构建程序的类、对象和方法。面向对象软件开发过程中的面向对象的分析,就是对实际问题进行抽象,从而建立物理模型的过程。在面向对象技术中使用这种数据抽象方法,一方面可以去除掉与核心问题无关的细枝末节,使开发工作可以集中在比较关键、主要的部分;另一方面,在数据抽象过程中对数据和操作的分析、辨别和定义可以帮助开发人员对整个问题有更深入、准确的认识。最后抽象形成的抽象数据类型,则是进一步设计、编程的基础和依据。第4页,共75页,2023年,2月20日,星期一北京邮电大学5面向对象的软件开发方法对象计算机世界抽象数据类概念世界实体现实世界抽象抽象实例化映射计算机逻辑的实现类第5页,共75页,2023年,2月20日,星期一北京邮电大学6现实生活中的实体可以将现实生活中的实体经过抽象,映射为程序中的对象。对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(class)。classCar

{StringcarNumber;Stringcolor;intdoorNumber;

……

voidbrake(){…}voidspeedUp(){…}voidslowDown(){…}}

第6页,共75页,2023年,2月20日,星期一北京邮电大学7二、封装面向对象方法的封装特性是一个与其抽象特性密切相关的特性。具体地,封装就是指利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的被授权的操作,才能够与这个抽象数据类型交流和交互。属性方法公有数据私有数据方法对象A数据方法对象B第7页,共75页,2023年,2月20日,星期一北京邮电大学8在面向对象的程序设计中,抽象数据类型是用“类”这种面向对象工具可理解和操纵的结构来代表的,每个类里都封装了相关的数据和操作。在实际的开发过程中,类多用来构建系统内部的模块,由于封装特性把类内的数据保护得很严密,模块与模块间仅通过严格控制的界面进行交互,使它们之间耦合和交叉大大减少,从而降低了开发过程的复杂性,提高了效率和质量,减少了可能的错误,同时也保证了程序中数据的完整性和安全性。第8页,共75页,2023年,2月20日,星期一北京邮电大学9面向对象技术的这种封装特性还有另一个重要意义,就是使抽象数据类型,即类或模块的可重用性大为提高。封装使得抽象数据类型对内成为一个结构完整、可自我管理、自我平衡、高度集中的整体;对外则是一个功能明确、接口单一、可在各种合适的环境下都能独立工作的有机的单元。这样的有机单元特别有利于构建、开发大型标准化的应用软件系统,可以大幅度地提高生产效率,缩短开发周期和降低各种费用。第9页,共75页,2023年,2月20日,星期一北京邮电大学10封装是一种数据隐藏技术,用户只能看到封装界面上的信息,对象内部对用户是不可见的。封装把对象的所有组成部分(包括数据和方法)组合在一起,定义了程序如何引用对象的数据;封装实际上使用方法将类的数据隐藏起来,控制用户对类的数据(域、属性)修改和访问的权限。被封装的对象之间是通过传递消息来进行联系的。一个消息由三部分组成:消息的接受对象接收对象要采取的方法方法需要的参数对象B对象A

消息第10页,共75页,2023年,2月20日,星期一北京邮电大学11为什么要使用类?采用简单数据类型表示现实世界中概念的局存在很大的限性。例如:采用int型数据表示一个日期概念,需要使用3个变量:

intday,month,year;并且在使用中必须时刻注意三者的联系和约束关系同时在使用日期概念时要同时对三个对象进行访问使用类可以把现实问题中的对象映射为程序中的一个整体——类。第11页,共75页,2023年,2月20日,星期一北京邮电大学124.2Java的类一、系统定义的类Java程序设计就是定义类的过程,但是Java程序中定义的类的数目和功能都是有限的,编程时还需要用到大量的系统定义好的类,即Java类库中的类。类库是Java语言的重要组成部分。Java语言由语法规则和类库两部分组成,语法规则确定Java程序的书写规范;类库,或称为运行时库,则提供了Java程序与运行它的系统软件(Java虚拟机)之间的接口。Java类库是一组由其他开发人员或软件供应商编写好的Java程序模块,每个模块通常对应一种特定的基本功能和任务,这样当自己编写的Java程序需要完成其中某一功能的时候,就可以直接利用这些现成的类库,而不需要一切从头编写。第12页,共75页,2023年,2月20日,星期一北京邮电大学13这些系统定义好的类根据实现的功能不同,可以划分成不同的集合。每个集合是一个包,合称为类库。Java的类库是系统提供的已实现的标准类的集合,是Java编程的API(applicationprograminterface),它可以帮助开发者方便、快捷地开发Java程序。Java的类库大部分是由它的发明者SUN公司提供的。这些类库称为基础类库(JFC),也有少量则是由其他软件开发商以商品形式提供的。根据功能的不同,Java的类库被划分为若干个不同的包,每个包中都有若干个具有特定功能和相互关系的类和接口。下面列出了一些经常使用的包。第13页,共75页,2023年,2月20日,星期一北京邮电大学141.

java.lang包java.lang包是Java语言的核心类库,包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等。每个Java程序运行时,系统都会自动地引入java.lang包,所以这个包的加载是缺省的。2.java.io包java.io包是Java语言的标准输入/输出类库,包含了实现Java程序与操作系统、用户界面以及其他Java程序做数据交换所使用的类,如基本输入/输出流、文件输入/输出流、过滤输入/输出流、管道输入/输出流、随机输入/输出流等。凡是需要完成与操作系统有关的较底层的输入输出操作的Java程序,都要用到java.io包。第14页,共75页,2023年,2月20日,星期一北京邮电大学153.java.util包java.util包包括了Java语言中的一些低级的实用工具,如处理时间的Date类,处理变长数组的Vector类,实现栈和杂凑表的Stack类和HashTable类等,使用它们开发者可以更方便快捷地编程。4.java.awt包java.awt包是Java语言用来构建图形用户界面(GUI)的类库,它包括了许多界面元素和资源,主要在三个方面提供界面设计支持:低级绘图操作,如Graphics类等;图形界面组件和布局管理,如Checkbox类、Container类、LayoutManager接口等;以及界面用户交互控制和事件响应,如Event类。利用java.awt包,开发人员可以很方便地编写出美观、方便、标准化的应用程序界面。第15页,共75页,2023年,2月20日,星期一北京邮电大学167.java.applet包Java.applet包是用来实现运行于Internet浏览器中的JavaApplet的工具类库,它仅包含少量几个接口和一个非常有用的类:java.applet.Applet。8.包包是Java语言用来实现网络功能的类库。由于Java语言还在不停地发展和扩充,它的功能,尤其是网络功能,也在不断地扩充。目前已经实现的Java网络功能主要有:底层的网络通信,如实现套接字通信的Socket类、ServerSocket类;编写用户自己的Telnet、FTP、邮件服务等实现网上通信的类;用于访问Internet上资源和进行CGI网关调用的类,如URL等。利用包中的类,开发者可以编写自己的具有网络功能的程序。第16页,共75页,2023年,2月20日,星期一北京邮电大学1715.java.awt.event包java.awt.event包是对JDK1.0版本中原有的Event类的一个扩充,它使得程序可以用不同的方式来处理不同类型的事件,并使每个图形界面的元素本身可以拥有处理它上面事件的能力。16.java.sql包java.sql包是实现JDBC(Javadatabaseconnection)的类库。利用这个包可以使Java程序具有访问不同种类的数据库的功能,如Oracle,Sybase,DB2,SQLServer等。只要安装了合适的驱动程序,同一个Java程序不需修改就可以存取、修改这些不同的数据库中的数据。JDBC的这种功能,再加上Java程序本身具有的平台无关性,大大拓宽了Java程序的应用范围,尤其是商业应用的适用领域。第17页,共75页,2023年,2月20日,星期一北京邮电大学18使用类库中系统定义好的类有三种方式:继承系统类,在用户程序里创建系统类的子类,例如每个JavaApplet的主类都是java.applet包中的Applet类的子类;创建系统类的对象,例如图形界面的程序中要接受用户的输入时,就可以创建一个系统类TextField类的对象来完成这个任务;直接使用系统类,例如在字符界面向系统标准输出输出字符串时使用的方法System.out.println(),就是系统类System的静态属性out的方法。第18页,共75页,2023年,2月20日,星期一北京邮电大学19系统类的使用:使用系统类的前提条件是这个系统类应该是用户程序可见的类。为此用户程序需要用import语句引入它所用到的系统类或系统类所在的包。例如使用图形用户界面的程序,应该用语句:

importjava.awt.*; importjava.awt.event.*;引入java.awt包和java.awt.event包。类库包中的程序都是字节码形式的程序,利用import语句将一个包引入到程序里,就相当于在编译过程中将该包中所有系统类的字节码加入到用户的Java程序中,这样用户Java程序就可以使用这些系统类及其中的各种功能。第19页,共75页,2023年,2月20日,星期一北京邮电大学20要认识到:用户程序中系统类库使用得越多、越全面、越准确,程序的质量就越高。因此,要掌握好Java语言面向对象的编程方法编写出高质量的程序,就必须对Java语言的类库有足够的了解和掌握。第20页,共75页,2023年,2月20日,星期一北京邮电大学21用户程序自定义类系统定义的类,虽然实现了许多常见的功能,但是在Java语言程序设计中,用户仍要根据编程的需要来定义一些类。类作为复合(引用)数据类型,它封装了一类对象的域和方法。创建一个类,就是创建一个新的数据类型,实例化一个类就得到一个具体的对象。第21页,共75页,2023年,2月20日,星期一北京邮电大学22类定义的格式[public][abstract|final]class

类名[extends

父类名][implements

接口名表]……类头{

域;方法;……类体}第22页,共75页,2023年,2月20日,星期一北京邮电大学23例4-11:classPhoneCard2:

{3:longcardNumber;4:privateintpassword;5:doublebalance;6:StringconnectNumber;7:booleanconnected;8:9:booleanperformConnection(longcn,intpw)

10:

{11:if(cn==cardNumber&&pw==password)12:{13:connected=true;14:returntrue;15:}16:else17:{

18:connected=false;19:returnfalse;20:}21:

}22:doublegetBalance()23:

{24:if(connected)25:returnbalance;26:else27:return-1;28:

}29:voidperformDial()30:{31:if(connected)32:balance-=0.5;33:

}34:}第23页,共75页,2023年,2月20日,星期一北京邮电大学24创建对象与定义构造函数

1.创建对象Java程序定义类的最终目的是使用它,像使用系统类一样,程序也可以继承用户自定义类或创建并使用自定义类的对象。创建对象与声明基本数据类型的变量类似,首先说明新建对象所属的类名,然后说明新建对象的名字,赋值号右边的new是为新建对象开辟内存空间的算符。像声明变量需要为变量开辟内存空间保存数据一样,创建对象也需要为对象开辟内存空间保存域和方法。与变量相比,对象占用的内存空间要大得多,对象是以类为模板创建的具体实例。第24页,共75页,2023年,2月20日,星期一北京邮电大学25创建对象的一般格式为:

类名新建对象名=new构造函数();创建PhoneCard类的对象可以使用如下的语句:

PhoneCardmyCard=newPhoneCard();一个类可以生成多个不同的对象(实例),同一个类的所有对象具有相同的性质,即其外部特性和内部特性都是相同的。一个对象的内部状态(私有属性)只能由其自身来修改,任何别的对象都不能来修改它。因此,同一类的对象虽然在内部状态的表现形式上相同,但他们可以有不同的内部状态,这些对象并不是一模一样的。第25页,共75页,2023年,2月20日,星期一北京邮电大学26Carcar1=newCar();

Carcar2=newCar();

Carcar3=newCar();

要访问或调用一个对象的域或方法需要首先访问这个对象,然后用算符“.”连接这个对象的某个域或方法。例如:

car1.color=“red”;car1.speedUp();调用对象的方法相当于给对象发送消息,收到消息的对象通过改变自身的状态或者向其它对象发送消息来响应消息。第26页,共75页,2023年,2月20日,星期一北京邮电大学27构造函数(constructor)创建对象与声明变量的另一个不同之处在于,创建对象的同时将调用这个对象的构造函数完成对象的初始化工作。声明变量时可以用赋值语句为它赋初值,而一个对象可能包括若干个域,需要若干个赋值语句,把若干个赋初值的语句组合成一个方法在创建对象时一次性同时执行,这个方法就是构造函数。构造函数是与类同名的方法,创建对象的语句用new算符开辟了新建对象的内存空间之后,将调用构造函数初始化这个新建对象。第27页,共75页,2023年,2月20日,星期一北京邮电大学28构造函数是类的一种特殊方法,它的特殊性主要体现在如下的几个方面:

(1)构造函数的方法名与类名相同。

(2)构造函数没有返回类型。

(3)构造函数的主要作用是完成对类对象的初始化工作。

(4)构造函数一般不能由编程人员显式直接调用。

(5)在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。注意:对象的域在对象初始化时自动初始化,没有初值的域都取为缺省值;而对象方法中的变量必须有初值,否则编译时出错。第28页,共75页,2023年,2月20日,星期一北京邮电大学29例如,可以为PhoneCard类定义如下的构造函数,初始化它的几个域。PhoneCard(longcn,intpw,doubleb,Strings) { cardNumber=cn; password=pw; if(b>0) balance=b; else System.exit(1); connectNumber=s; connected=false; }第29页,共75页,2023年,2月20日,星期一北京邮电大学30定义了构造函数之后,就可以用如下的语句创建并初始化PhoneCard对象:PhoneCardnewCard=newPhoneCard(12345678,1234,50.0,”300”);这个对象的卡号是12345678,密码是1234,金额是50.0,电话卡的接入号码是字符串“300”。可见构造函数定义了几个形式参数,创建对象的语句在调用构造函数时就应该提供几个类型顺序一致的实际参数,指明新建对象各域的初始值。利用这种机制就可以创建不同初始特性的同类对象。第30页,共75页,2023年,2月20日,星期一北京邮电大学31在一个类中可以定义多个不同形式参数的构造函数,这样可通过调用不同的构造函数来创建对象;如果用户自定义类未定义类的构造函数,系统将为这个类缺省定义一个空构造函数,没有形式参数,也没有任何具体语句,不完成任何操作。构造函数的特点有:(1)构造函数和类具有相同的名字。(2)一个类可以有多个构造函数。(3)构造函数可以有0个、1个或多个参数。(4)构造函数没有返回值。(5)构造函数总是和new运算符一起被调用例4-2是使用PhoneCard类的一个完整例子。第31页,共75页,2023年,2月20日,星期一北京邮电大学324.3类的修饰符每个类都拥有自己的名字空间,它代表类及其方法和变量可以在一定的范围内知道彼此的存在,可以相互使用。Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性。类的修饰符分为访问控制符和非访问控制符两大类:可访问控制符是:public非访问控制符有:abstract,final有些类的修饰符也可以用来修饰类中的域或方法。第32页,共75页,2023年,2月20日,星期一北京邮电大学33公共类修饰符publicJava语言中类的可访问控制符只有一个:public即公共的。一个类被定义为公共类,表明它可以被所有的其它类或其它包中的类所访问和引用,即这个类作为一个整体,是可见的、可以使用的,程序的其它部分可以创建这个类的对象、访问这个类内部可见的(用可访问控制符public定义的)变量和方法。Java的类是通过包的概念来组织的,包是类的一种松散的集合。处于同一个包中的类可以不需任何说明而方便地互相访问和引用,而对于在不同包中的类,一般说来,它们相互之间是不可见的,当然也不可能互相引用。第33页,共75页,2023年,2月20日,星期一北京邮电大学34定义在同一个程序中的所有类属于一个包。假如一个类没有访问控制符,说明它具有缺省的访问控制特性。这种缺省的访问控制权规定该类只能被同一个包中的类访问和引用,而不可以被其他包中的类使用,这种访问特性又称为包访问性。通过声明类的访问控制符可以使整个程序结构清晰、严谨,减少可能产生的类间干扰和错误。第34页,共75页,2023年,2月20日,星期一北京邮电大学35抽象类abstract凡是用abstract修饰符修饰的类被称为抽象类。抽象类就是没有具体对象的概念类。把各类的公共属性从它们各自的类定义中抽取出来形成一个抽象类。抽象类是它的所有子类的公共属性的集合。鸽子燕子麻雀天鹅鸟第35页,共75页,2023年,2月20日,星期一北京邮电大学36例如abstractclassDrawing{abstractvoiddrawDot(intx,inty);voiddrawLine(intx1,inty1,intx2,inty2){//drawusingthedrawDot()methodrepeatedly.

}}抽象类中往往声明方法的存在而不去实现它。一个abstract类可以包含抽象方法、非抽象方法和变量。第36页,共75页,2023年,2月20日,星期一北京邮电大学37有时在库开发中,要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该行为;取而代之,在子类中实现该方法,知道其行为的其它类可以在类中实现这些方法。这种类就是abstract类。不能创建abstract类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。例如:假设Employee是抽象类,Engineer及Manager都是其子类,尽管Employee不能创建实例,但可以这样使用:

Employeee1=newEngineer();Employeee2=newManager();Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。第37页,共75页,2023年,2月20日,星期一北京邮电大学38最终类(final)如果一个类被final修饰符所修饰和限定,说明这个类不可能有子类。被定义为final的类通常是一些有固定作用、用来完成某种标准功能的类。如Java系统定义好的用来实现网络功能的InetAddress、Socket等类都是final类。在Java程序中,当通过类名引用一个类或其对象时,实际真正引用的既可能是这个类或其对象本身,也可能是这个类的某个子类及子类的对象,即具有一定的不确定性。将一个类定义为final则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而保证引用这个类时所实现的功能的正确无误。第38页,共75页,2023年,2月20日,星期一北京邮电大学39abstract和final修饰符不能同时修饰一个类,因为abstract类自身没有具体对象,需要派生出子类后再创建子类的对象;而final类不可能有子类,这样abstractfinal类就无法使用,也就没有意义了。abstract和final可以各自与其他修饰符合用。例如一个类可以是publicabstract的,也可以是publicfinal的。当一个以上的修饰符修饰类(或类中的域、方法)时,这些修饰符之间以空格分开,写在class关键字之前,修饰符之间的先后排列次序对类的性质没有影响。第39页,共75页,2023年,2月20日,星期一北京邮电大学404.4类的静态属性——域域是类和对象的静态属性,它可以是基本数据类型的变量,也可以是其他类(系统类或用户自定义类)的对象,所以定义类时定义域的操作就是说明变量或创建对象的操作。与类相似,域也可以拥有若干修饰符,包括访问控制符和非访问控制符。域的定义格式:[public∣private∣protected

][static][final][transient][volatile]

数据类型变量名1[,变量名2];第40页,共75页,2023年,2月20日,星期一北京邮电大学41访问控制符有:public、private、protected;非访问控制符有:静态域修饰符static、最终域修饰符final、易失(共享)域修饰符volatile、暂时性域修饰符transient。公共访问控制符public用public修饰的域称为公共域。如果公共域属于一个公共类,则可以被所有其它类所引用。由于public修饰符会降低运行的安全性和数据的封装性,所以一般应减少public域的使用。第41页,共75页,2023年,2月20日,星期一北京邮电大学42私有访问控制符private用private修饰的成员变量(域)只能被该类自身所访问,而不能被任何其它类(包括子类)所引用。private修饰符用来声明类的私有成员,它提供了最高的保护级别。当其他类希望获取或修改私有成员时,需要借助于类的方法来实现,从而保证了私有数据的私有性。

publicclassAccount{

privateintaccoutNo;privateintpassword;

……voidsetPassword(inta){password=a;}intgetPassword(){returnpassword;}

……

}

以上方法实际上实现了对成员变量的隐藏。第42页,共75页,2023年,2月20日,星期一北京邮电大学43保护访问控制符protected用protected修饰的成员变量可以被三种类所引用:该类自身、与它在同一个包中的其他类、在其他包中的该类的子类。使用protected修饰符的主要作用是允许其他包中的它的子类来访问父类的特定属性。类内的域如果没有访问控制符来限定,也说明它们具有包访问性,可以被同一个包中的其他类所访问和调用。第43页,共75页,2023年,2月20日,星期一北京邮电大学44静态域static用static修饰符修饰的域是仅属于类的静态域。静态域最本质的特点是:它们是类的域,不属于任何一个类的具体对象。它不保存在某个对象的内存区间中,而是保存在类的内存区域的公共存储单元。对于该类的任何一个具体对象而言,静态域是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值;同样任何一个类的对象去修改它时,也都是在对同一个内存单元进行操作。类的静态域可以不创建类的对象即可直接引用。例如:System.out.println();例4-3第44页,共75页,2023年,2月20日,星期一北京邮电大学45publicclassTestCounter{publicstaticvoidmain(String[]args){System.out.println("Numberofcounteris"+Count.getTotalCount());Countcount1=newCount();System.out.println("Numberofcounteris"+Count.getTotalCount());}}publicclassCount{privateintserialNumber;privatestaticintcounter=0;publicstaticintgetTotalCount(){returncounter;}publicCount(){counter++;serialNumber=counter;}}Outputis:Numberofcounteris0Numberofcounteris1第45页,共75页,2023年,2月20日,星期一北京邮电大学46静态初始化器静态初始化器是由关键字static引导的一对大括号括起的语句组。它的作用与类的构造函数有些相似,都是用来完成初始化的工作,但是静态初始化器在三点上与构造函数有根本的不同:(1)构造函数是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化。(2)构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用执行。(3)不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数列表。例4-4第46页,共75页,2023年,2月20日,星期一北京邮电大学47最终域程序中经常需要定义各种类型的常量,如0.1,″300″等,并为它们取一个类似于变量名的标识符名字,这样就可以在程序中用这个名字来引用常量,而不是直接使用常量数值。final就是用来修饰常量的修饰符,一个类的域如果被声明为final,那么它的取值在程序的整个执行过程中都不会改变。如:staticfinalStringconnectNumber=″200″;用final修饰符说明常量时,需要注意以下几点:(1)需要说明常量的数据类型。(2)需要同时指出常量的具体取值。(3)因为所有类对象的常量成员,其数值都固定一致,为了节省空间,常量通常声明为static。例Month2.java第47页,共75页,2023年,2月20日,星期一北京邮电大学48易失域volatile如果一个域被volatile修饰符所修饰,说明这个域可能同时被几个线程所控制和修改,即这个域不仅仅被当前程序所掌握,在运行过程中可能存在其他未知的程序操作来影响和改变该域的取值。在使用当中应该特别留意这些影响因素。通常,volatile用来修饰接受外部输入的域。如表示当前时间的变量将由系统的后台线程随时修改,以保证程序中取到的总是最新的当前的系统时间,所以可以把它定义为易失域。第48页,共75页,2023年,2月20日,星期一北京邮电大学49暂时性域修饰符transienttransient是用来定义一个暂时性变量。其特点是:用修饰符transient限定的暂时性变量,将指定Java虚拟机认定该暂时性变量不属于永久状态,以实现不同对象的存档功能。否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。第49页,共75页,2023年,2月20日,星期一北京邮电大学504.5方法方法是类的动态属性,标志了类所具有的功能和操作,用来把类和对象的数据封装在一起。Java的方法与其他语言中的函数或过程类似,是一段用来完成某种操作的程序片断。方法由方法头和方法体组成,其一般格式如下:[public∣private∣protected][static][final|abstract][native][synchronized]

返回值类型方法名([形式参数列表])[throws异常列表]……方法头{

方法体各语句;……方法体}

第50页,共75页,2023年,2月20日,星期一北京邮电大学51小括号是方法的标志,程序使用方法名来调用方法,形式参数是方法从调用它的环境输入的数据,返回值是方法在操作完成后返还给调用它的环境的数据。定义方法的目的是定义具有相对独立和常用功能的模块,使程序结构清晰,也利于模块在不同场合的重复利用。例4-5PerfectNum.java第51页,共75页,2023年,2月20日,星期一北京邮电大学52注意:返回类型可以是任意的Java数据类型,当一个方法不需要返回值时,返回类型为void。方法头中如果指定了非void的返回值类型,方法体中就必须包含一条return语句保证任何情况下都有返回数值。参数的类型可以是简单数据类型,也可以是引用数据类型(数组、类或接口),参数传递方式是值传递。第52页,共75页,2023年,2月20日,星期一北京邮电大学53方法体是对方法的实现。它包括局部变量的声明以及所有合法的Java指令。局部变量的作用域只在该方法内部。Java语言中调用方法有两类:一类是需要程序书写专门的调用命令来调用的方法,称为程序调用方法;

另一类是运行过程中系统自动调用的方法,称为系统方法,例如Applet中init()、start()、paint()等。这两类方法的定义和使用原则有很大差异。第53页,共75页,2023年,2月20日,星期一北京邮电大学54参数传递方式是值传递---实例classA{staticvoidchange(Strings,StringBuffersb){s=“aaaa”;sb.setLength(0);sb.append(“aaaa”);}publicstaticvoidmain(Stringargs[]){Strings=“bbbb”;StringBuffersb=newStringBuffer(“bbbb”);change(s,sb);System.out.println(s);System.out.println(sb);}}输出结果:bbbbaaaa第54页,共75页,2023年,2月20日,星期一北京邮电大学55方法的控制修饰符也分为:访问控制符和非访问控制符两类。访问控制符有:public、private、protected。非访问控制符有:abstract、static、final、native、synchronized。访问控制符的作用类似于域的修饰符。第55页,共75页,2023年,2月20日,星期一北京邮电大学56DDprivateBB缺省BB+CprotectedBApublic缺省public

类属性与方法A代表所有的类;B代表当前类所在的包;C代表当前类的所有子类;D代表当前类本身。类、属性和方法的访问控制第56页,共75页,2023年,2月20日,星期一图4.6程序中的访问控制区域第57页,共75页,2023年,2月20日,星期一北京邮电大学58抽象方法abstract修饰符abstract修饰的抽象方法是一种仅有方法头,而没有具体的方法体和操作实现的方法。例如抽象类PhoneCard中定义的一个抽象方法:

abstractvoidperformDial();

没有方法体的抽象方法performDial()的具体实现,要留到当前类的不同子类在它们各自的类定义中完成。也就是说,各子类在继承了父类的抽象方法之后,再分别用不同的语句和方法体来重新定义它,形成若干个名字相同,返回值相同,参数列表也相同,目的一致但是具体实现有一定差别的方法。第58页,共75页,2023年,2月20日,星期一北京邮电大学59使用抽象方法的目的是使所有的抽象类的所有子类对外都呈现一个相同名字的方法,是一个统一的接口。事实上,为abstract方法书写方法体是没有意义的,因为abstract方法所依附的abstract类没有自己的对象,只有它的子类才存在具体的对象,而它的不同子类对这个abstract方法有互不相同的实现方法,除了参数列表和返回值之外,抽取不出其他的公共点。所以就只能把abstract方法作为一个共同的接口,表明当前抽象类的所有子类都使用这个接口来完成相同的功能。第59页,共75页,2023年,2月20日,星期一北京邮电大学60定义abstract方法的优点,就是可以隐藏具体的细节信息,使调用该方法的程序不必过分关注类及其子类内部的具体状况。由于所有的子类使用的都是相同的方法头,方法头里实际包含了调用该方法的程序语句所需要了解的全部信息。所有的抽象方法,都必须存在于抽象类之中。一个非抽象类中出现抽象方法是非法的,也即,一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体。不过抽象类不一定只能拥有抽象方法,它可以包含非抽象的方法。例4-6第60页,共75页,2023年,2月20日,星期一北京邮电大学61静态方法static用static修饰符修饰的方法,是属于整个类的类方法;而不用static修饰符限定的方法,是属于某个具体类对象或实例的方法。声明一个方法为static至少有三重含义:(1)调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名;(2)非static的方法是属于某个对象的方法,在这个对象创建时对象的方法在内存中拥有自己专用的代码段;而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有;第61页,共75页,2023年,2月20日,星期一北京邮电大学62(3)由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,也即,static方法只能处理static域。例如:classStaticError{ Stringmystring=“hello”; publicstaticvoidmain(Stringargs[]){ System.out.println(mystring); }}编译时错误信息:nonstaticvariablemystringcannotbereferencedfromastaticcontext“System.out.println(mystring);”。第62页,共75页,2023年,2月20日,星期一北京邮电大学63解决办法1:将变量改成类变量classStaticError{staticStringmystring=“hello”;publicstaticvoidmain(Stringargs[]){ System.out.println(mystring);}}解决办法2:先创建一个类的实例classNoStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){NoStaticErrornoError=newNoStaticError();System.out.println(noError.mystring);}}第63页,共75页,2023年,2月20日,星期一北京邮电大学64publicclassTestCounter{publicstaticvoidmain(String[]args){System.out.println("Numberofcounteris"+Count.getTotalCount());Countcount1=newCount();System.out.println("Numberofcounteris"+Count.getTotalCount());}}publicclassCount{privateintserialNumber;privatestaticintcounter=0;publicstaticintgetTotalCount(){returncounter;}publicCount(){counter++;serialNumber=counter;}}Outputis:Numberofcounteris0Numberofcounteris1第64页,共75页,2023年,2月20日,星期一北京邮电大学65方法重载(Overloading)和覆盖(Overriding)方法的重载是指在一类中多个方法可以享用相同的名字,但是这些方法的参数必须不同,或者是参数个数不同,或者是参数的类型不同。编译器根据参数的个数和类型来决定当前所使用的方法。如果两个方法的声明中的参数的类型和个数均相同,只是返回类型不同,则编译时会产生错误,即返回类型不能用来区分重载的方法。第65页,共75页,2023年,2月20日,星期一北京邮电大学66例如,要打印不同类型的数据,int,float,Stri

温馨提示

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

评论

0/150

提交评论