清华大学java2课件

上传人:m**** 文档编号:569780530 上传时间:2024-07-31 格式:PPT 页数:138 大小:458KB
返回 下载 相关 举报
清华大学java2课件_第1页
第1页 / 共138页
清华大学java2课件_第2页
第2页 / 共138页
清华大学java2课件_第3页
第3页 / 共138页
清华大学java2课件_第4页
第4页 / 共138页
清华大学java2课件_第5页
第5页 / 共138页
点击查看更多>>
资源描述

《清华大学java2课件》由会员分享,可在线阅读,更多相关《清华大学java2课件(138页珍藏版)》请在金锄头文库上搜索。

1、第二章第二章类与对象的基本概念类与对象的基本概念JAVA语言程序设计1清华大学java2JAVA语言程序设计清华大学 郑莉目录目录2.1 面向对象的程序设计方法概述面向对象的程序设计方法概述2.2 类与对象类与对象 2.3 对象初始化和回收对象初始化和回收 2.4 应用举例应用举例 2.5 UML简介简介2.6 本章小节本章小节2清华大学java2JAVA语言程序设计清华大学 郑莉2.1 面向对象的程序设计方法概述面向对象的程序设计方法概述l面向对象的程序设计面向对象的程序设计与结构化程序设计方法相比,更符合人类认识现实世界的思维方式 已成为程序设计的主流方向涉及的主要概念l抽象l封装l继承l

2、多态 3清华大学java2JAVA语言程序设计清华大学 郑莉l对象对象现实世界中l万物皆对象l都具有各自的属性,对外界都呈现各自的行为 程序中l一切都是对象l都具有标识 (identity), 属性和行为(方法)通过一个或多个变量来保存其状态通过方法(method) 实现他的行为2.1 面向对象的程序设计方法概述面向对象的程序设计方法概述(续续)面向对象程序设计方法概述4清华大学java2JAVA语言程序设计清华大学 郑莉l类类将属性及行为相同或相似的对象归为一类类可以看成是对象的抽象,代表了此类对象所具有的共有属性和行为在面向对象的程序设计中,每一个对象都属于某个特定的类, 面向对象程序设计

3、方法概述2.1 面向对象的程序设计方法概述面向对象的程序设计方法概述(续续)5清华大学java2JAVA语言程序设计清华大学 郑莉l结构化程序设计结构化程序设计通常由若干个程序模块组成,每个程序模块都可以是子程序或函数数据和功能分离,代码难于维护和复用l面向对象程序设计面向对象程序设计基本组成单位是类程序在运行时由类生成对象,对象是面向对象程序的核心对象之间通过发送消息进行通信,互相协作完成相应功能2.1 面向对象的程序设计方法概述面向对象的程序设计方法概述(续续)面向对象程序设计方法概述6清华大学java2JAVA语言程序设计清华大学 郑莉2.1.1 抽象抽象l抽象抽象忽略问题中与当前目标无

4、关的方面,以便更充分地注意与当前目标有关的方面计算机软件开发中所使用的抽象有l过程抽象l数据抽象面向对象程序设计方法概述7清华大学java2JAVA语言程序设计清华大学 郑莉l过程抽象过程抽象将整个系统的功能划分为若干部分,强调功能完成的过程和步骤,而隐藏其具体的实现任何一个明确定义的功能操作都可被看作单个的实体,尽管这个操作实际上可能由一系列更低级的操作来完成基于过程抽象的两个标准程序设计技术l过程分解l递归技术 2.1.1 抽象抽象(续续) 过程抽象过程抽象面向对象程序设计方法概述8清华大学java2JAVA语言程序设计清华大学 郑莉l数据抽象数据抽象将需要处理的数据和这些数据上的操作结合

5、在一起,抽象成不同的抽象数据类型每个抽象数据类型既包含了数据,也包含了针对这些数据的操作相对于过程抽象,数据抽象是更为合理的抽象方法2.1.1 抽象抽象(续续) 数据抽象数据抽象面向对象程序设计方法概述9清华大学java2JAVA语言程序设计清华大学 郑莉l例:例:钟表l数据(属性)int Hour; int Minute; int Second;l方法(行为)SetTime(); ShowTime();2.1.1 抽象抽象(续续)面向对象程序设计方法概述10清华大学java2JAVA语言程序设计清华大学 郑莉l例:例:人l数据(属性)char *name; char *gender; int

6、 age; int id;l方法(行为)生物行为Eat(), Step(),社会行为Work(), Study(),面向对象程序设计方法概述2.1.1 抽象抽象(续续)11清华大学java2JAVA语言程序设计清华大学 郑莉2.1.2 封装封装l封装封装是一种信息隐蔽技术利用抽象数据类型将数据和基于数据的操作封装在一起用户只能看到对象的封装界面信息,对象的内部细节对用户是隐蔽的封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象面向对象程序设计方法概述12清华大学java2JAVA语言程序设计清华大学 郑莉l封装的定义封装的定义清楚的边界l

7、所有对象的内部信息被限定在这个边界内接口l对象向外界提供的方法,外界可以通过这些方法与对象进行交互受保护的内部实现l功能的实现细节,不能从类外访问。2.1.2 封装封装(续续)面向对象程序设计方法概述13清华大学java2JAVA语言程序设计清华大学 郑莉l封装的意义封装的意义在面向对象的程序设计中,类封装了数据及对数据的操作,是程序中的最小模块禁止了外界直接操作类中的数据,模块与模块之间只能通过严格控制的接口进行交互,这使得模块之间的偶合度大大降低保证了模块具有较好的独立性,程序维护和修改较为容易2.1.2 封装封装(续续)面向对象程序设计方法概述14清华大学java2JAVA语言程序设计清

8、华大学 郑莉2.1.3 继承继承l继承继承是指新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的派生类(也称为子类)在继承过程中派生类继承了基类的特性,包括方法和实例变量派生类也可修改继承的方法或增加新的方法,使之更适合特殊的需要有助于解决软件的可重用性问题,使程序结构清晰,降低了编码和维护的工作量面向对象程序设计方法概述15清华大学java2JAVA语言程序设计清华大学 郑莉l单继承单继承任何一个派生类都只有单一的直接父类类层次结构为树状结构l多继承多继承一个类可以有一个以上的直接父类类层次结构为网状结构,设计及实现比较复杂lJavaJava语言仅支持单继承语言仅支持

9、单继承2.1.3 继承继承(续续)面向对象程序设计方法概述16清华大学java2JAVA语言程序设计清华大学 郑莉2.1.4 多态多态l多态多态一个程序中同名的不同方法共存主要通过子类对父类方法的覆盖来实现不同类的对象可以响应同名的消息(方法) ,具体的实现方法却不同使语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序方法同名问题面向对象程序设计方法概述17清华大学java2JAVA语言程序设计清华大学 郑莉l类与对象类与对象在程序中,对象是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(Class)一个类是对一类对象的描述。类是构造对象的模板对象是类的具体实例2.2 类

10、与对象类与对象18清华大学java2JAVA语言程序设计清华大学 郑莉2.2.1 类的声明类的声明l声明形式声明形式public abstract | final class 类名称类名称 extends 父类名称父类名称 implements 接口名称列表接口名称列表 变量成员声明及初始化;变量成员声明及初始化; 方法声明及方法体;方法声明及方法体;类与对象19清华大学java2JAVA语言程序设计清华大学 郑莉l关键字关键字Classl表明其后声明的是一个类。extendsl如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后implementsl如果所声明的类要实

11、现某些接口,那么,接口的名字应写在implements之后2.2.1 类的声明类的声明(续续)类与对象20清华大学java2JAVA语言程序设计清华大学 郑莉l修饰符修饰符可以有多个,用来限定类的使用方式publicl表明此类为公有类abstractl指明此类为抽象类finall指明此类为终结类 l类声明体类声明体变量成员声明及初始化l可以有多个方法声明及方法体l可以有多个2.2.1 类的声明类的声明(续续)类与对象21清华大学java2JAVA语言程序设计清华大学 郑莉l钟表类钟表类public class Clock / 成员变量成员变量 int hour ; int minute ; i

12、nt second ; / 成员方法成员方法 public void setTime(int newH, int newM, int newS) hour=newH ; minute=newM ; second=news ; public void showTime() System.out.println(hour+:+minute+:+second); 2.2.1 类的声明类的声明(续续) 例例2_1类与对象22清华大学java2JAVA语言程序设计清华大学 郑莉l变量和对象变量和对象变量除了存储基本数据类型的数据,还能存储对象的引用,用来存储对象引用的变量称为引用变量类的对象也称为类的实

13、例2.2.2 对象的声明与引用对象的声明与引用类与对象23清华大学java2JAVA语言程序设计清华大学 郑莉l对象的声明对象的声明格式类名 变量名 例如Clock是已经声明的类名,则下面语句声明的变量aclock将用于存储该类对象的引用: Clock aclock; 声明一个引用变量时并没有对象生成2.2.2 对象的声明与引用对象的声明与引用(续续)类与对象24清华大学java2JAVA语言程序设计清华大学 郑莉l对象的创建对象的创建生成实例的格式:new () 例如: aclock=new Clock()其作用是:l在内存中为此对象分配内存空间l返回对象的引用(reference ,相当于

14、对象的存储地址)引用变量可以被赋以空值例如:aclock=null;2.2.2 对象的声明与引用对象的声明与引用(续续)类与对象25清华大学java2JAVA语言程序设计清华大学 郑莉2.2.3 数据成员数据成员l数据成员数据成员表示Java类的状态声明数据成员必须给出变量名及其所属的类型,同时还可以指定其他特性在一个类中成员变量名是唯一的数据成员的类型可以是Java中任意的数据类型(简单类型,类,接口,数组)分为实例变量和类变量类与对象26清华大学java2JAVA语言程序设计清华大学 郑莉声明格式public | protected | private static finaltransi

15、ent volatile变量数据类型变量数据类型 变量名变量名1=变量初值变量初值, 变量名变量名2=变量初值变量初值, ;格式说明lpublic、protected、private 为访问控制符lstatic指明这是一个静态成员变量lfinal指明变量的值不能被修改ltransient指明变量是临时状态lvolatile指明变量是一个共享变量2.2.3 数据成员数据成员(续续)类 与 对 象27清华大学java2JAVA语言程序设计清华大学 郑莉l实例变量实例变量没有static修饰的变量称为实例变量(Instance Variables)用来存储所有实例都需要的属性信息,不同实例的属性值可

16、能会不同可通过下面的表达式访问实例属性的值.2.2.3 数据成员数据成员(续续)实例变量实例变量类与对象28清华大学java2JAVA语言程序设计清华大学 郑莉l声明一个表示圆的类,保存在文件声明一个表示圆的类,保存在文件Circle.java 中。中。然后编写测试类,保存在文件然后编写测试类,保存在文件ShapeTester.java中,并与中,并与Circle.java放在相同的目录下放在相同的目录下public class Circle int radius; public class ShapeTester public static void main(String args) Ci

17、rcle x; x = new Circle(); System.out.println(x); System.out.println(radius = + x.radius); 2.2.3 数据成员数据成员(续续)例例2_2类与对象29清华大学java2JAVA语言程序设计清华大学 郑莉l编译后运行结果如下:编译后运行结果如下:Circle26b249radius =0l解释解释之后的数值为x所指的对象的存储地址x的值及对象的状态如图2.2.3 数据成员数据成员(续续)例例2_2运行结果运行结果类与对象30清华大学java2JAVA语言程序设计清华大学 郑莉l声明一个表示矩形的类声明一个表示

18、矩形的类,保存在保存在Rectangle.java中;中;编写测试类,保存在编写测试类,保存在ShapeTester.java中,二文中,二文件保存在相同的目录下件保存在相同的目录下public class Rectangle double width = 10.128; double height = 5.734; public class ShapeTester public static void main(String args) Circle x; Rectangle y; x = new Circle(); y = new Rectangle(); System.out.print

19、ln(x + + y); 2.2.3 数据成员数据成员(续续)例例2_3类与对象31清华大学java2JAVA语言程序设计清华大学 郑莉l编译后运行结果如下:编译后运行结果如下:Circle82f0db Rectangle92d342l解释解释Circle及Rectangle类对象的状态如图2.2.3 数据成员数据成员(续续)例例2_3运行结果运行结果类与对象32清华大学java2JAVA语言程序设计清华大学 郑莉l对对ShapeTester类进行修改,使两个实例具有不同类进行修改,使两个实例具有不同的实例变量值的实例变量值public class ShapeTester public sta

20、tic void main(String args) Circle x; Rectangle y, z; x = new Circle(); y = new Rectangle(); z = new Rectangle(); x.radius = 50; z.width = 68.94; z.height = 47.54; System.out.println(x.radius + + y.width + + z.width); 2.2.3 数据成员数据成员(续续)例例2_3修改修改类与对象33清华大学java2JAVA语言程序设计清华大学 郑莉l编译后运行结果如下:编译后运行结果如下:50

21、10.128 68.94l解释解释Circle及Rectangle类对象的状态如图2.2.3 数据成员数据成员(续续)修改后运行结果修改后运行结果类与对象34清华大学java2JAVA语言程序设计清华大学 郑莉l地址簿程序地址簿程序一个人的地址通常包括以下信息:姓名,省份,城市,街道,门牌号,邮政编码采用过程化的程序设计方法,使用简单变量存储,则存储两个人地址的代码如下2.2.3 数据成员数据成员(续续)例例2_4类与对象35清华大学java2JAVA语言程序设计清华大学 郑莉public static void main(String args) String name1,name2; in

22、t gateNumber1, gateNumber2; String streetName1,streetName2; String city1,city2; String province1,province2; String postalCode1,postalCode2; name1 = Zhang Li; gateNumber1 = 15; streetName1 = Tsinghua East Road; city1 = Beijing; province1 = “Beijing; postalCode1 = 100084; name2 = Li Hong; gateNumber2

23、= 2; streetName2 = BeiNong; city2 = Beijing; province2 = Beijing; postalCode2 = 102206; /.do something interesting 2.2.3 数据成员数据成员(续续)例例2_4类与对象36清华大学java2JAVA语言程序设计清华大学 郑莉采用面向对象的程序设计方法,则需要首先声明Address类如下public class Address String name; int gateNumber; String streetName; String city; String province;

24、String postalCode; /方法成员略 2.2.3 数据成员数据成员(续续)例例2_4类与对象37清华大学java2JAVA语言程序设计清华大学 郑莉主方法改写如下public static void main(String args) Address address1 = new Address(), address2 = new Address(); address1.name = “Zhang Li; address1.streetNumber = 15; address1.streetName = “Tsinghua East Road; address1.city = “

25、Beijing; address1.province = “Beijing; address1.postalCode = “100084; address2.name = “Li Hong; address2.streetNumber = 2; address2.streetName = “BeiNong; address2.city = “Beijing; address2.province = “Beijing; address2.postalCode = “102206; /.do something interesting 2.2.3 数据成员数据成员(续续)例例2_4类与对象38清华

26、大学java2JAVA语言程序设计清华大学 郑莉l类变量类变量也称为静态变量,声明时需加static修饰符不管类的对象有多少,类变量只存在一份,在整个类中只有一个值类初始化的同时就被赋值适用情况l类中所有对象都相同的属性l经常需要共享的数据l系统中用到的一些常量值引用格式.2.2.3 数据成员数据成员(续续)类变量类变量类与对象39清华大学java2JAVA语言程序设计清华大学 郑莉l对于一个圆类的所有对象,计算圆的面积对于一个圆类的所有对象,计算圆的面积时,都需用到时,都需用到的值,可在的值,可在Circle类的声明类的声明中增加一个类属性中增加一个类属性PIpublic class Cir

27、cle static double PI = 3.14159265; int radius; 当我们生成Circle类的实例时,在每一个实例中并没有存储PI的值,PI的值存储在类中2.2.3 数据成员数据成员(续续)例例2_5类与对象40清华大学java2JAVA语言程序设计清华大学 郑莉对类变量进行测试public class ClassVariableTester public static void main(String args) Circle x = new Circle(); System.out.println(x.PI); System.out.println(Circle.

28、PI); Circle.PI = 3.14; System.out.println(x.PI); System.out.println(Circle.PI); 测试结果3.141592653.141592653.143.142.2.3 数据成员数据成员(续续)例例2_5运行结果运行结果类与对象41清华大学java2JAVA语言程序设计清华大学 郑莉l声明一个声明一个Point类,有两个私有变量保存点类,有两个私有变量保存点坐标,一个类变量保存已有点的个数坐标,一个类变量保存已有点的个数public class Point private int x; private int y; public

29、 static int pointCount=0; public Point(int x, int y) this.x = x; this.y = y; pointCount+;2.2.3 数据成员数据成员(续续)Point.java类与对象42清华大学java2JAVA语言程序设计清华大学 郑莉l测试类测试类ex2_4class ex2_4 public static void main(String args) Point p = new Point(1,1); System.out.println(p.pointCount); Point q = new Point(2,2); Syst

30、em.out.println(q.pointCount); System.out.println(q.pointCount = Point.pointCount); System.out.println(Point.pointCount);2.2.3 数据成员数据成员(续续)Point类测试类测试类与对象43清华大学java2JAVA语言程序设计清华大学 郑莉l测试结果测试结果12true2 2.2.3 数据成员数据成员(续续)Point类测试结果类测试结果类与对象44清华大学java2JAVA语言程序设计清华大学 郑莉l实例变量和类变量都可被声明为实例变量和类变量都可被声明为finallfi

31、nal实例变量必须在每个构造方法结实例变量必须在每个构造方法结束之前赋初值,以保证使用之前会被束之前赋初值,以保证使用之前会被初始化初始化lfinal类变量必须在声明的同时初始化类变量必须在声明的同时初始化2.2.3 数据成员数据成员(续续)final修饰符修饰符类与对象45清华大学java2JAVA语言程序设计清华大学 郑莉2.2.4 方法成员方法成员l方法成员方法成员定义类的行为l一个对象能够做的事情l我们能够从一个对象取得的信息可以没有,也可以有多个;一旦在类中声明了方法,它就成为了类声明的一部分分为实例方法和类方法类与对象46清华大学java2JAVA语言程序设计清华大学 郑莉声明格式

32、public | protected | private static finalabstract native synchronized返回类型返回类型 方法名方法名(参数列表参数列表) throws exceptionList方法体方法体2.2.4 方法成员方法成员(续续)声明格式声明格式类与对象47清华大学java2JAVA语言程序设计清华大学 郑莉格式说明l方法修饰public、protected、private 为存取控制符static指明方法是一个类方法final指明方法是一个终结方法abstract指明方法是一个抽象方法native用来集成java代码和其它语言的代码synchr

33、onized用来控制多个并发线程对共享数据的访问2.2.4 方法成员方法成员(续续)格式说明格式说明类与对象48清华大学java2JAVA语言程序设计清华大学 郑莉格式说明(续)l返回类型方法返回值的类型,可以是任意的Java数据类型当不需要返回值时,返回类型为voidl参数类型简单数据类型,引用类型(数组、类或接口)可以有多个参数,也可以没有参数,方法声明时的参数称为形式参数l方法体方法的实现包括局部变量的声明以及所有合法的Java指令局部变量的作用域只在该方法内部lthrows exceptionList用来处理异常2.2.4 方法成员方法成员(续续)格式说明格式说明类与对象49清华大学j

34、ava2JAVA语言程序设计清华大学 郑莉l方法调用方法调用给对象发消息意味着调用对象的某个方法l从对象中取得信息 l修改对象的状态或进行某种操作 l进行计算及取得结果等调用格式.(参数列表)称点操作符“.”前面的为消息的接收者(receiver)参数传递l值传递:参数类型为基本数据类型时l引用传递:参数类型为对象类型或数组时2.2.4 方法成员方法成员(续续)方法调用方法调用类与对象50清华大学java2JAVA语言程序设计清华大学 郑莉l 实例方法实例方法表示特定对象的行为声明时前面不加static修饰符使用时需要发送给一个类实例2.2.4 方法成员方法成员(续续)实例方法实例方法类与对象

35、51清华大学java2JAVA语言程序设计清华大学 郑莉l在在Circle类中声明计算周长的方法类中声明计算周长的方法 public class Circle static double PI = 3.14159265; int radius; public double circumference() return 2 * PI * radius; 由于radius是实例变量,在程序运行时,Java会自动取其接收者对象的属性值也可将circumference方法体改为:return 2 * PI * this.radius; 关键字this代表此方法的接收者对象2.2.4 方法成员方法成员(

36、续续)例例2_6类与对象52清华大学java2JAVA语言程序设计清华大学 郑莉l方法调用测试方法调用测试public class CircumferenceTester public static void main(String args) Circle c1 = new Circle(); c1.radius = 50; Circle c2 = new Circle(); c2.radius = 10; double circum1 = c1.circumference(); double circum2 = c2.circumference(); System.out.println(

37、Circle 1 has circumference + circum1); System.out.println(Circle 2 has circumference + circum2); 2.2.4 方法成员方法成员(续续)例例2_6类与对象53清华大学java2JAVA语言程序设计清华大学 郑莉l运行结果运行结果Circle 1 has circumference 314.159265Circle 2 has circumference 62.831853l说明说明在使用实例方法时,需要将其发送给一个实例对象(也称给对象发送一条消息),radius的值即是接收者对象的值在执行c1.ci

38、rcumference()时,radius的值为c1的radius属性值;在执行c2.circumference()时,radius的值为c2的radius属性值类与对象2.2.4 方法成员方法成员(续续)例例2_6运行结果运行结果54清华大学java2JAVA语言程序设计清华大学 郑莉l在在Circle类及类及Rectangle类中声明计算面积的方法类中声明计算面积的方法area()2.2.4 方法成员方法成员(续续)例例2_7public class Circle static double PI = 3.14159265; int radius; public double circum

39、ference() return 2 * PI * radius; public double area() return PI * radius * radius; public class Rectangle double width; double height; public double area() return width * height; 类与对象55清华大学java2JAVA语言程序设计清华大学 郑莉l声明测试类,对声明测试类,对Circle类及类及Rectangle类的类的area()方法方法进行测试进行测试 public class AreaTester public

40、static void main(String args) Circle c = new Circle(); c.radius = 50; Rectangle r = new Rectangle(); r.width = 20; r.height = 30; System.out.println(Circle has area + c.area(); System.out.println(Rectangle has area + r.area(); 类与对象2.2.4 方法成员方法成员(续续)例例2_756清华大学java2JAVA语言程序设计清华大学 郑莉l运行结果运行结果Circle ha

41、s area 7853.981625Rectangle has area 600.0l说明说明不同的类中可以声明相同方法名的方法使用时,系统会根据接收者对象的类型找到相应类的方法2.2.4 方法成员方法成员(续续)例例2_7运行结果运行结果类与对象57清华大学java2JAVA语言程序设计清华大学 郑莉l带参数的方法举例:在带参数的方法举例:在Circle类中增加方法改变圆类中增加方法改变圆的半径的半径public class Circle static double PI = 3.14159265; int radius; public double circumference() retu

42、rn 2 * PI * radius; public double area() return PI * radius * radius; public void enlarge(int factor) radius = radius * factor; 2.2.4 方法成员方法成员(续续)例例2_8类与对象58清华大学java2JAVA语言程序设计清华大学 郑莉l测试类测试类public class EnlargeTester public static void main(String args) Circle c1 = new Circle(); c1.radius = 50; Circ

43、le c2 = new Circle(); c2.radius = 10; System.out.println(Circle 1 的周长: + c1.circumference(); System.out.println(Circle 2 的周长: + c2.circumference(); c2.enlarge(4); System.out.println(Circle 2 扩大后的周长: + c2.circumference(); 2.2.4 方法成员方法成员(续续)例例2_8类与对象59清华大学java2JAVA语言程序设计清华大学 郑莉l运行结果运行结果Circle 1 的周长: 3

44、14.159265Circle 2 的周长: 62.831853Circle 2 扩大后的周长: 251.3274122.2.4 方法成员方法成员(续续)例例2_8运行结果运行结果类与对象60清华大学java2JAVA语言程序设计清华大学 郑莉l以对象作为参数的方法举例:在以对象作为参数的方法举例:在Circle类中增加类中增加fitsInside方法判断一个圆是否在一个长方形内,方法判断一个圆是否在一个长方形内,需要以需要以Rectangle类的对象作为参数类的对象作为参数public class Circle static double PI = 3.14159265; int radiu

45、s; public double circumference() return 2 * PI * radius; public void enlarge(int factor) radius = radius * factor; public boolean fitsInside (Rectangle r) return (2 * radius r.width) & (2 * radius r.height); 2.2.4 方法成员方法成员(续续)例例2_9类与对象61清华大学java2JAVA语言程序设计清华大学 郑莉 测试类测试类 public class InsideTester pub

46、lic static void main(String args) Circle c1 = new Circle(); c1.radius = 8; Circle c2 = new Circle(); c2.radius = 15; Rectangle r = new Rectangle(); r.width = 20; r.height = 30; System.out.println(Circle 1 fits inside Rectangle: + c1.fitsInside(r); System.out.println(Circle 2 fits inside Rectangle: +

47、 c2.fitsInside(r); 2.2.4 方法成员方法成员(续续)例例2_9类与对象62清华大学java2JAVA语言程序设计清华大学 郑莉l运行结果运行结果Circle 1 fits inside Rectangle: trueCircle 2 fits inside Rectangle: false2.2.4 方法成员方法成员(续续)例例2_9运行结果运行结果类与对象63清华大学java2JAVA语言程序设计清华大学 郑莉l类方法类方法也称为静态方法,表示类中对象的共有行为声明时前面需加static修饰符不能被声明为抽象的类方法可以在不建立对象的情况下用类名直接调用,也可用类实例调

48、用2.2.4 方法成员方法成员(续续)类方法类方法类与对象64清华大学java2JAVA语言程序设计清华大学 郑莉l将摄氏温度将摄氏温度(centigrade)转换成华氏温度转换成华氏温度(fahrenheit)转换公式为 fahrenheit = centigrade * 9 / 5 + 32除了摄氏温度值及公式中需要的常量值,此功能不依赖于具体的类实例的属性值,因此可声明为类方法转换方法centigradeToFahrenheit放在类Converter中public class Converter public static int centigradeToFahrenheit(int

49、cent) return (cent * 9 / 5 + 32); 方法调用Converter.centigradeToFahrenheit(40)2.2.4 方法成员方法成员(续续)例例2_10类与对象65清华大学java2JAVA语言程序设计清华大学 郑莉l包包是一组类的集合l一个包可以包含若干个类文件,还可包含若干个包包的作用l将相关的源代码文件组织在一起l类名的空间管理,利用包来划分名字空间,便可以避免类名冲突l提供包一级的封装及存取权限2.2.5 类的组织类的组织包的概念包的概念类与对象66清华大学java2JAVA语言程序设计清华大学 郑莉l包的命名包的命名每个包的名称必须是“独一

50、无二”的Java中包名使用小写字母表示命名方式建议l将机构的Internet域名反序,作为包名的前导l若包名中有任何不可用于标识符的字符,用下划线替代l若包名中的任何部分与关键字冲突,后缀下划线l若包名中的任何部分以数字或其他不能用作标识符起始的字符开头,前缀下划线2.2.5 类的组织类的组织包的概念包的概念类与对象67清华大学java2JAVA语言程序设计清华大学 郑莉l编译单元与类空间编译单元与类空间一个Java源代码文件称为一个编译单元,由三部分组成l所属包的声明(省略,则属于默认包)lImport (引入)包的声明,用于导入外部的类l类和接口的声明一个编译单元中只能有一个public类

51、,该类名与文件名相同,编译单元中的其他类往往是public类的辅助类,经过编译,每个类都会产一个class文件利用包来划分名字空间,便可以避免类名冲突2.2.5 类的组织类的组织包的概念包的概念(续续)类与对象68清华大学java2JAVA语言程序设计清华大学 郑莉l包的声明包的声明命名的包(命名的包(Named Packages)l例如: package Mypackage;默认包(未命名的包)默认包(未命名的包)l不含有包声明的编译单元是默认包的一部分2.2.5 类的组织类的组织包的概念包的概念(续续)类与对象69清华大学java2JAVA语言程序设计清华大学 郑莉l包与目录包与目录Jav

52、a使用文件系统来存储包和类包名就是文件夹名,即目录名目录名并不一定是包名用javac编译源程序时,如遇到当前目录(包)中没有声明的类,就会以环境变量classpath为相对查找路径,按照包名的结构来查找。因此,要指定搜寻包的路径,需设置环境变量classpath2.2.5 类的组织类的组织包的概念包的概念(续续)类与对象70清华大学java2JAVA语言程序设计清华大学 郑莉l引入包引入包 为了使用其它包中所提供的类,需要使用import语句引入所需要的类Java编译器为所有程序自动引入包java.langimport语句的格式 import package1.package2. (class

53、name |*);l其中package1.package2表明包的层次,它对应于文件目录lclassname则指明所要引入的类名l如果要引入一个包中的所有类,则可以使用星号(*)来代替类名类与对象2.2.5 类的组织类的组织包的概念包的概念(续续)71清华大学java2JAVA语言程序设计清华大学 郑莉l类的访问控制类的访问控制类的访问控制只有public(公共类)及无修饰符(缺省类)两种访问权限符与访问能力之间的关系如表类与对象2.2.6 类的访问控制类的访问控制类型类型无修饰无修饰public同一包中的类yesyes不同包中的类noyes72清华大学java2JAVA语言程序设计清华大学

54、郑莉l类成员的访问控制类成员的访问控制公有(public)l可以被其他任何对象访问(前提是对类成员所在的类有访问权限) 保护(protected)l只可被同一类及其子类的实例对象访问私有(private)l只能被这个类本身访问,在类外不可见默认(default)l仅允许同一个包内的访问;又被称为“包(package)访问权限”2.2.6 类成员的访问控制类成员的访问控制类与对象73清华大学java2JAVA语言程序设计清华大学 郑莉类型类型private无修饰无修饰protectedpublic同一类同一类yesyesyesyes同一包中的同一包中的子类子类noyesyesyes同一包中的同一

55、包中的非子类非子类noyesyesyes不同包中的不同包中的子类子类nonoyesyes不同包中的不同包中的非子类非子类nononoyes2.2.6 类成员的访问控制类成员的访问控制(续续)类与对象74清华大学java2JAVA语言程序设计清华大学 郑莉l对例对例2-6中的中的Circle类声明进行修改,给实类声明进行修改,给实例变量加上例变量加上private修饰符修饰符public class Circle static double PI = 3.14159265; private int radius; public double circumference() return 2 *

56、PI * radius; 2.2.6 类成员的访问控制类成员的访问控制(续续)例例2_11类与对象75清华大学java2JAVA语言程序设计清华大学 郑莉l再编译再编译CircumferenceTester.javapublic class CircumferenceTester public static void main(String args) Circle c1 = new Circle(); c1.radius = 50; Circle c2 = new Circle(); c2.radius = 10; double circum1 = c1.circumference(); d

57、ouble circum2 = c2.circumference(); System.out.println(Circle 1 has circumference + circum1); System.out.println(Circle 2 has circumference + circum2); 2.2.6 类成员的访问控制类成员的访问控制(续续)例例2_11类与对象76清华大学java2JAVA语言程序设计清华大学 郑莉l编译时会提示出错编译时会提示出错在编译语句“c1.radius = 50;”及“c2.radius =10;”时会提示存在语法错误“radius has privat

58、e access in Circle”l说明说明由于在Circle类声明中变量radius被声明为private,因此在其它类中不能直接对radius进行存取如果要允许其它类访问radius的值,就需要在Circle类中声明相应的公有方法。通常有两类典型的方法用于访问属性值,get方法及set方法2.2.6 类成员的访问控制类成员的访问控制(续续)例例2_11编译编译类与对象77清华大学java2JAVA语言程序设计清华大学 郑莉lget方法方法功能是取得属性变量的值get方法名以“get”开头,后面是实例变量的名字一般具有以下格式:public get() return ; 对于实例变量ra

59、dius,声明其get方法如下:public int getRadius() return radius; 2.2.6 类成员的访问控制类成员的访问控制(续续)get方法方法类与对象78清华大学java2JAVA语言程序设计清华大学 郑莉lset方法方法功能是修改属性变量的值set方法名以“set”开头,后面是实例变量的名字一般具有以下格式public void set( ) = ; 声明实例变量radius的set方法如下:public void setRadius(int r) radius = r;2.2.6 类成员的访问控制类成员的访问控制(续续)set方法方法类与对象79清华大学ja

60、va2JAVA语言程序设计清华大学 郑莉l关键字关键字this的使用的使用如果形式参数名与实例变量名相同,则需要在实例变量名之前加this关键字,否则系统会将实例变量当成形式参数。在上面的set方法中,如果形式参数为radius,则需要在成员变量radius之前加上关键字this。代码如下:public void setRadius(int radius) this.radius = radius; 2.2.6 类成员的访问控制类成员的访问控制(续续)set方法方法类与对象80清华大学java2JAVA语言程序设计清华大学 郑莉2.3 对象初始化和回收对象初始化和回收l对象初始化对象初始化系统

61、在生成对象时,会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化l对象回收对象回收对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收81清华大学java2JAVA语言程序设计清华大学 郑莉2.3.1 构造方法构造方法l构造方法构造方法一种和类同名的特殊方法用来初始化对象Java中的每个类都有构造方法,用来初始化该类的一个新的对象没有定义构造方法的类,系统自动提供默认的构造方法对象初始化和回收82清华大学java2JAVA语言程序设计清华大学 郑莉l构造方法的特点构造方法的特点方法名与类名相同没有返回类型,修饰符void也不能有通常被声明为公有的(public)可以有任意多个参数

62、主要作用是完成对象的初始化工作不能在程序中显式的调用在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化2.3.1 构造方法构造方法(续续)对象初始化和回收83清华大学java2JAVA语言程序设计清华大学 郑莉l系统提供的默认构造方法系统提供的默认构造方法如果在类的声明中没有声明构造方法,则Java编译器会提供一个默认的构造方法默认的构造方法没有参数,其方法体为空使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,则对象的属性值为零或空对象初始化和回收2.3.1 构造方法构造方法(续续)默认构造方法默认构造方法84清华大学java2JAVA语言程序设计清华大学

63、郑莉l声明一个银行帐号类及测试代码声明一个银行帐号类及测试代码public class BankAccountString ownerName; int accountNumber; float balance;public class BankTester public static void main(String args) BankAccount myAccount = new BankAccount(); System.out.println(ownerName= + myAccount.ownerName); System.out.println(accountNumber= +

64、myAccount.accountNumber); System.out.println(balance= + myAccount.balance);2.3.1 构造方法构造方法(续续)例例2_12(使用默认构造方法)(使用默认构造方法)对象初始化和回收85清华大学java2JAVA语言程序设计清华大学 郑莉l运行结果运行结果ownerName=nullaccountNumber=0balance=0.0对象初始化和回收2.3.1 构造方法构造方法(续续)例例2_12运行结果运行结果86清华大学java2JAVA语言程序设计清华大学 郑莉l自定义构造方法与方法重载自定义构造方法与方法重载可在生

65、成对象时给构造方法传送初始值,使用希望的值给对象初始化构造方法可以被重载,构造方法的重载和方法的重载一致一个类中有两个及以上同名的方法,但参数表不同,这种情况就被称为方法重载。在方法调用时,Java可以通过参数列表的不同来辨别应调用哪一个方法对象初始化和回收2.3.1 构造方法构造方法(续续)自定义构造方法自定义构造方法87清华大学java2JAVA语言程序设计清华大学 郑莉l为为BankAccount声明一个有三个参数的构造方法声明一个有三个参数的构造方法public BankAccount(String initName, int initAccountNumber, float init

66、Balance) ownerName = initName; accountNumber = initAccountNumber; balance = initBalance; l假设一个新帐号的初始余额可以为假设一个新帐号的初始余额可以为0,则可增加一个带有两,则可增加一个带有两个参数的构造方法个参数的构造方法public BankAccount(String initName, int initAccountNumber) ownerName = initName; accountNumber = initAccountNumber; balance = 0.0f; 对象初始化和回收2.3

67、.1 构造方法构造方法(续续)例例2_1388清华大学java2JAVA语言程序设计清华大学 郑莉l自定义无参的构造方法自定义无参的构造方法无参的构造方法对其子类的声明很重要。如果在一个类中不存在无参的构造方法,则要求其子类声明时必须声明构造方法,否则在子类对象的初始化时会出错在声明构造方法时,好的声明习惯是l不声明构造方法l如果声明,至少声明一个无参构造方法对象初始化和回收2.3.1 构造方法构造方法(续续)自定义无参构造方法自定义无参构造方法89清华大学java2JAVA语言程序设计清华大学 郑莉l构建一个构建一个Bush类,有两个有参数的构造方法类,有两个有参数的构造方法classBus

68、hBush(inti)Bush(doubled)如果写:newBush(); 编译器将要告诉你找不到对应的构造方法l说明说明用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法2.3.1 构造方法构造方法(续续)Bush.java对象初始化和回收90清华大学java2JAVA语言程序设计清华大学 郑莉l在例在例2_13基础上再声明一个无参的构基础上再声明一个无参的构造方法造方法public BankAccount() ownerName = ; accountNumber =

69、 999999; balance = 0.0f; 对象初始化和回收2.3.1 构造方法构造方法(续续)例例2_1491清华大学java2JAVA语言程序设计清华大学 郑莉l创建一个拥有两个构造方法的创建一个拥有两个构造方法的Tree类,一个有类,一个有参,一个无参。参,一个无参。import java.util.*;class Tree int height; Tree() prt(Planting a seedling); height = 0; Tree(int i) prt(Creating new Tree that is + i + feet tall); height = i; v

70、oid info() prt(Tree is + height + feet tall); void info(String s) prt(s + : Tree is + height + feet tall); static void prt(String s) System.out.println(s); 2.3.1 构造方法构造方法(续续)Tree.java对象初始化和回收92清华大学java2JAVA语言程序设计清华大学 郑莉l测试测试Tree类类public class Overloading public static void main(String args) for(int

71、i = 0; i 5; i+) Tree t = new Tree(i); t.info(); t.info(overloaded method); new Tree(); 2.3.1 构造方法构造方法(续续)Overloading.java对象初始化和回收93清华大学java2JAVA语言程序设计清华大学 郑莉l测试结果测试结果Creating new Tree that is 0 feet tallTree is 0 feet talloverloaded method: Tree is 0 feet tallCreating new Tree that is 1 feet tallTre

72、e is 1 feet talloverloaded method: Tree is 1 feet tallCreating new Tree that is 2 feet tallTree is 2 feet talloverloaded method: Tree is 2 feet tallCreating new Tree that is 3 feet tallTree is 3 feet talloverloaded method: Tree is 3 feet tallCreating new Tree that is 4 feet tallTree is 4 feet tallov

73、erloaded method: Tree is 4 feet tallPlanting a seedling2.3.1 构造方法构造方法(续续)Overloading测试结果测试结果对象初始化和回收94清华大学java2JAVA语言程序设计清华大学 郑莉lthis关键字的使用关键字的使用可以使用this关键字在一个构造方法中调用另外的构造方法代码更简洁,维护起来也更容易通常用参数个数比较少的构造方法调用参数个数最多的构造方法2.3.1 构造方法构造方法(续续)this关键字的使用关键字的使用对象初始化和回收95清华大学java2JAVA语言程序设计清华大学 郑莉l使用使用this关键字,修改

74、关键字,修改BankAccout类中无类中无参数和二参数的构造方法参数和二参数的构造方法对象初始化和回收public BankAccount() this(, 999999, 0.0f); public BankAccount(String initName, int initAccountNumber) this(initName, initAccountNumber, 0.0f); public BankAccount(String initName, int initAccountNumber, float initBalance) ownerName = initName; accou

75、ntNumber = initAccountNumber; balance = initBalance; 2.3.1 构造方法构造方法(续续)BankAccount.java96清华大学java2JAVA语言程序设计清华大学 郑莉l内存回收技术内存回收技术当一个对象在程序中不再被使用时,就成为一个无用对象l当前的代码段不属于对象的作用域l把对象的引用赋值为空Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存Java运行时系统会在对对象进行自动垃圾回收前,自动调用对象的finalize()方法2.3.2 内存回收技术内存回收技术对象初始化和回收97清华大学java2JAVA语言程序

76、设计清华大学 郑莉l垃圾收集器垃圾收集器自动扫描对象的动态内存区,对不再使用的对象做上标记以进行垃圾回收作为一个线程运行l通常在系统空闲时异步地执行l当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,与系统同步运行2.3.2 内存回收技术内存回收技术(续续)垃圾收集器垃圾收集器对象初始化和回收98清华大学java2JAVA语言程序设计清华大学 郑莉lfinalize()方法方法在类java.lang.Object中声明,因此 Java中的每一个类都有该方法用于释放系统资源,如关闭打开的文件或socket等声明格式protected void finalize() throw

77、s throwable如果一个类需要释放除内存以外的资源,则需在类中重写finalize()方法2.3.2 内存回收技术内存回收技术(续续)finalize()方法方法对象初始化和回收99清华大学java2JAVA语言程序设计清华大学 郑莉l同同C和和C+的区别的区别C语言中通过free来释放内存C+中则通过delete来释放内存在C和C+中,如果程序员忘记释放内存,则容易造成内存泄漏甚至导致内存耗尽在Java中不会发生内存泄漏情况,但对于其它资源,则有产生泄漏的可能性2.3.2 内存回收技术内存回收技术(续续)同同C和和C+的区别的区别对象初始化和回收100清华大学java2JAVA语言程序

78、设计清华大学 郑莉l对银行帐户类对银行帐户类BankAccount进行一系进行一系列修改和测试列修改和测试声明BankAccount类声明toString()方法声明存取款方法使用DecimalFormat类声明类方法生成特殊的实例声明类变量2.4 应用举例应用举例101清华大学java2JAVA语言程序设计清华大学 郑莉l包括状态、构造方法、包括状态、构造方法、get方法及方法及set方法方法public class BankAccountprivate String ownerName; private int accountNumber; private float balance; p

79、ublic BankAccount() this(, 0, 0); public BankAccount(String initName, int initAccNum, float initBal) ownerName = initName; accountNumber = initAccNum; balance = initBal; 应用举例2.4.1 声明声明BankAccount类类102清华大学java2JAVA语言程序设计清华大学 郑莉 public String getOwnerName() return ownerName; public int getAccountNumbe

80、r() return accountNumber; public float getBalance() return balance; public void setOwnerName(String newName) ownerName = newName; public void setAccountNumber(int newNum) accountNumber = newNum; public void setBalance(float newBalance) balance = newBalance; 应用举例2.4.1 声明声明BankAccount类类(续续)BankAccount

81、.java103清华大学java2JAVA语言程序设计清华大学 郑莉l声明测试类声明测试类AccountTesterpublic class AccountTester public static void main(String args) BankAccount anAccount; anAccount = new BankAccount(ZhangLi, 100023,0); anAccount.setBalance(anAccount.getBalance() + 100); System.out.println(Here is the account: + anAccount); S

82、ystem.out.println(Account name: + anAccount.getOwnerName(); System.out.println(Account number: + anAccount.getAccountNumber(); System.out.println(Balance: $ + anAccount.getBalance(); 应用举例2.4.1 声明声明BankAccount类类AccountTester.java104清华大学java2JAVA语言程序设计清华大学 郑莉l测试结果测试结果Here is the account: BankAccount37

83、2a1aAccount name: ZhangLiAccount number: 100023Balance: $100.0应用举例2.4.1 声明声明BankAccount类类(续续)AccountTester测试结果测试结果105清华大学java2JAVA语言程序设计清华大学 郑莉ltoString()方法方法将对象的内容转换为字符串Java的所有类都有一个默认的toString()方法,其方法体如下: getClass().getName() + + Integer.toHexString(hashCode()l下面的两行代码等价 System.out.println(anAccount

84、); System.out.println(anAccount.toString();如果需要特殊的转换功能,则需要自己重写toString()方法应用举例2.4.2 声明声明toString()方法方法106清华大学java2JAVA语言程序设计清华大学 郑莉ltoString()方法的几点说明方法的几点说明必须被声明为public返回类型为String方法的名称必须为toString,且没有参数在方法体中不要使用输出方法System.out.println()2.4.2 声明声明toString()方法方法(续续)几点说明几点说明107清华大学java2JAVA语言程序设计清华大学 郑莉l

85、为为BankAccount类添加自己的类添加自己的toString()方法方法public String toString() return(Account # + accountNumber + with balance $ + balance); 应用举例2.4.2 声明声明toString()方法方法(续续)修改修改BankAccount类类108清华大学java2JAVA语言程序设计清华大学 郑莉l对对BankAccount类进行重新编译并运行测类进行重新编译并运行测试类试类BankAccountTester,结果如下结果如下Here is the account: Account #

86、100023 with balance $100.0Account name: ZhangLiAccount number: 100023Balance: $100.0应用举例2.4.2 声明声明toString()方法方法(续续)测试结果测试结果109清华大学java2JAVA语言程序设计清华大学 郑莉l给给BankAccount类增加存款及取款方法类增加存款及取款方法/存款 public float deposit(float anAmount) balance += anAmount; return(balance); / 取款 public float withdraw(float a

87、nAmount) balance -= anAmount; return(anAmount); 应用举例2.4.3 声明存取款方法声明存取款方法110清华大学java2JAVA语言程序设计清华大学 郑莉public class AccountTester public static void main(String args) BankAccount anAccount; anAccount = new BankAccount(ZhangLi, 100023,0); anAccount.setBalance(anAccount.getBalance() + 100); System.out.p

88、rintln(anAccount); System.out.println(); anAccount = new BankAccount(WangFang, 100024,0); System.out.println(anAccount); anAccount.deposit(225.67f); anAccount.deposit(300.00f); System.out.println(anAccount); anAccount.withdraw(400.17f); System.out.println(anAccount); 应用举例2.4.3 声明存取款方法声明存取款方法(续续)修改修改

89、AccountTester.java111清华大学java2JAVA语言程序设计清华大学 郑莉l测试结果测试结果Account #100023 with balance $100.0Account #100024 with balance $0.0Account #100024 with balance $525.67Account #100024 with balance $125.49997应用举例2.4.3 声明存取款方法声明存取款方法(续续)测试结果测试结果112清华大学java2JAVA语言程序设计清华大学 郑莉lDecimalFormat类类在java.text包中在toStrin

90、g()方法中使用DecimalFormat类的实例方法format对数据进行格式化修改后的toString()方法如下应用举例2.4.4 使用使用DecimalFormat类类public String toString() return(Account # + accountNumber + with balance + new java.text.DecimalFormat($0.00).format(balance); 113清华大学java2JAVA语言程序设计清华大学 郑莉l对对BankAccount类重新进行编译,再运行类重新进行编译,再运行BankTester类,运行结果如下类,

91、运行结果如下Account #100023 with balance $100.00Account #100024 with balance $0.00Account #100024 with balance $525.67Account #100024 with balance $125.50应用举例2.4.4 使用使用DecimalFormat类类(续续)测试结果测试结果114清华大学java2JAVA语言程序设计清华大学 郑莉l声明类方法返回特殊的声明类方法返回特殊的BankAccount实例,实例,作用是生成特定的几种账号样例作用是生成特定的几种账号样例Example1()方法应用举例

92、2.4.5 声明类方法生成特殊的实例声明类方法生成特殊的实例 public static BankAccount example1() BankAccount ba = new BankAccount(); ba.setOwnerName(LiHong); ba.setAccountNumber(554000); ba.deposit(1000); return ba; 115清华大学java2JAVA语言程序设计清华大学 郑莉Example2()public static BankAccount example2() BankAccount ba = new BankAccount(); b

93、a.setOwnerName(ZhaoWei); ba.setAccountNumber(554001); ba.deposit(1000); ba.deposit(2000); return ba; 应用举例2.4.5 声明类方法生成特殊的实例声明类方法生成特殊的实例(续续)example2()方法方法116清华大学java2JAVA语言程序设计清华大学 郑莉emptyAccountExample()public static BankAccount emptyAccountExample() BankAccount ba = new BankAccount(); ba.setOwnerNa

94、me(HeLi); ba.setAccountNumber(554002); return ba; 2.4.5 声明类方法生成特殊的实例声明类方法生成特殊的实例(续续)emptyAccountExample()方法方法应用举例117清华大学java2JAVA语言程序设计清华大学 郑莉l修改修改BankAccount类类增加类变量LAST_ACCOUNT_NUMBER,初始值为0,当生成一个新的BankAccount对象时,其帐号为LAST_ACCOUNT_NUMBER的值累加1自动产生对象的accountNumber,且不允许直接修改其值修改构造方法,取消帐号参数取消setAccountNum

95、ber方法取消setBalance方法应用举例2.4.6 声明类变量声明类变量118清华大学java2JAVA语言程序设计清华大学 郑莉public class BankAccount2 private static int LAST_ACCOUNT_NUMBER = 0; private int accountNumber; private String ownerName; private float balance; public BankAccount2() this(, 0); public BankAccount2(String initName) this(initName, 0

96、); public BankAccount2(String initName, float initBal) ownerName = initName; accountNumber = +LAST_ACCOUNT_NUMBER; balance = initBal; 应用举例2.4.6 声明类变量声明类变量BankAccount2.java119清华大学java2JAVA语言程序设计清华大学 郑莉public static BankAccount2 example1() BankAccount2 ba = new BankAccount2(); ba.setOwnerName(LiHong);

97、 ba.deposit(1000); return ba; public static BankAccount2 example2() BankAccount2 ba = new BankAccount2(); ba.setOwnerName(ZhaoWei); ba.deposit(1000); ba.deposit(2000); return ba; public static BankAccount2 emptyAccountExample() BankAccount2 ba = new BankAccount2(); ba.setOwnerName(HeLi); return ba;

98、应用举例2.4.6 声明类变量声明类变量BankAccount2.java120清华大学java2JAVA语言程序设计清华大学 郑莉 public int getAccountNumber() return accountNumber; public String getOwnerName() return ownerName; public float getBalance() return balance; public void setOwnerName(String aName) ownerName = aName; 应用举例2.4.6 声明类变量声明类变量BankAccount2.j

99、ava121清华大学java2JAVA语言程序设计清华大学 郑莉public String toString() return(Account #+ new java.text.DecimalFormat(000000).format(accountNumber) + with balance + new java.text.DecimalFormat($0.00).format(balance); public float deposit(float anAmount) balance += anAmount; return balance; public float withdraw(fl

100、oat anAmount) if (anAmount = balance) balance -= anAmount; return anAmount; 2.4.6 声明类变量声明类变量BankAccount2.java应用举例122清华大学java2JAVA语言程序设计清华大学 郑莉public class AccountTester2 public static void main(String args) BankAccount2 bobsAccount, marysAccount, biffsAccount; bobsAccount = BankAccount2.example1();

101、marysAccount = BankAccount2.example1(); biffsAccount = BankAccount2.example2(); marysAccount.setOwnerName(Mary); marysAccount.deposit(250); System.out.println(bobsAccount); System.out.println(marysAccount); System.out.println(biffsAccount); 2.4.6 声明类变量声明类变量AccountTester2.java应用举例123清华大学java2JAVA语言程序

102、设计清华大学 郑莉l测试结果测试结果Account #000001 with balance $1000.00Account #000002 with balance $1250.00Account #000003 with balance $3000.002.4.6 声明类变量声明类变量 AccountTester2测试结果测试结果应用举例124清华大学java2JAVA语言程序设计清华大学 郑莉l类图类图由类和它们之间的关系组成定义系统中的类,表示类的内部结构(类的属性和操作)表示类与类之间的关系(如继承关系)是构建其他图的基础UML简介2.5.1 类图类图128清华大学java2JAVA

103、语言程序设计清华大学 郑莉类名类名属性属性操作操作BankAccountaccountNumberownerNamebalancewithdrawdeposit类的图形符号BankAccount类的图形表示l类的图形表示类的图形表示由三部分组成l类的名字l类的属性l类的操作(方法) 在实际使用时可以l省掉操作部分l省略属性及操作部分2.5.1 类图类图(续续)类的图形表示类的图形表示UML简介129清华大学java2JAVA语言程序设计清华大学 郑莉l关联关联描述了系统中对象或实例间的离散连接包括l普通关联l聚集l组成2.5.1 类图类图(续续)类的关系表示类的关系表示(关联关联)UML简介1

104、31清华大学java2JAVA语言程序设计清华大学 郑莉l聚集聚集表示部分与整体关系的关联用端点带有空菱形的线段表示,空菱形与聚集类相连接l例子例子一个人可以参加零个或多个课题组,每个课题组至少包含一个人。课题组与人之间是聚集的关系,如图UML简介2.5.1 类图类图(续续)类的关系表示类的关系表示(聚集聚集)课题组课题组人人*1 . *133清华大学java2JAVA语言程序设计清华大学 郑莉l组成组成也表示部分与整体关系的关联与聚集不同的是,部分类完全隶属于整体类,部分与整体共存,整体不存在了部分也会随之消失。用一个实菱形物附在组成端表示UML简介2.5.1 类图类图(续续)类的关系表示类

105、的关系表示(组成组成)l例子例子一个Windows窗体可由菜单、工具条、列表框、文本框、按钮组成。如果窗体不存在了,则其上的组成元素也无法存在。因此,他们之间是组成关系,如图窗体窗体菜单菜单工具条工具条列表框列表框按钮按钮文本框文本框*134清华大学java2JAVA语言程序设计清华大学 郑莉l泛化(继承)泛化(继承)就是通常所说的继承关系是通用元素和具体元素之间的一种分类关系。具体元素完全拥有通用元素的信息,并且还可以附加一些其他信息用从子类指向父类(也称为基类或超类)的箭头表示,指向父类的是一个空三角形UML简介2.5.1 类图类图(续续)类的关系表示类的关系表示(泛化泛化)基类子类A子类

106、B135清华大学java2JAVA语言程序设计清华大学 郑莉lUML对定义泛化关系的要求对定义泛化关系的要求具体元素应与通用元素完全一致,通用元素具有的属性、操作和关联,具体元素也都隐含地具有具体元素还应包含通用元素所没有的额外信息允许使用通用元素实例的地方,也应能够使用具体元素的实例2.5.1 类图类图(续续)类的关系表示类的关系表示(泛化泛化)136清华大学java2JAVA语言程序设计清华大学 郑莉2.5.2 对象图对象图l对象图对象图可以看作是类图的实例,能帮助人理解一个比较复杂的类图 在UML中,对象图与类图具有几乎完全相同的表示形式,主要差别是对象的名字下面要加一条下划线 对象名有下列三种表示格式 l对象名:类名 l:类名 l对象名 UML简介137清华大学java2JAVA语言程序设计清华大学 郑莉2.6 本章小结本章小结l本章内容本章内容面向对象程序设计的基本概念和思想Java语言类与对象的基本概念和语法,包括类的声明、类成员的访问,以及对象的构造、初始化和回收UML图的概念,类图和对象图的画法l本章要求本章要求理解类和对象的概念熟练使用类及其成员的访问控制方法熟练掌握各种构造方法了解java的垃圾回收机制能够绘制简单的类图和对象图138清华大学java2

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号