【文档说明】Java类与对象基本概念课件.ppt,共(124)页,1001.047 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-45167.html
以下为本文档部分文字说明:
JAVA语言第二章类与对象的基本概念1JAVA语言2•本章内容•面向对象程序设计的基本概念和思想•Java类与对象的基本概念和语法,包括类的声明、类成员的访问,以及对象的构造、初始化和回收•本章要求•理解类和对象的概念•熟练使用类及其成员的访问控制方法•熟练掌握各种构造方法•了解ja
va的垃圾回收机制JAVA语言2.1面向对象的程序设计方法概述•面向对象的程序设计(ObjectOrientedProgramming,简称OOP)•与结构化程序设计方法相比,更符合人类认识现实世界的思维方式•已成为程序设计的主流方向•涉及的主要概念•抽象(abstrac
tion)•封装(encapsulation)•继承(inheritance)•多态(polymorphism)3JAVA语言2.1面向对象的程序设计方法概述(续)•对象•现实世界中•万物皆对象•都具有各自的属性,对外界都呈现各自的行为•程序中
•一切都是对象•都具有标识(identity),属性和行为(方法)•通过一个或多个变量来保存其状态•通过方法(method)实现他的行为4JAVA语言2.1面向对象的程序设计方法概述(续)•类•将属性及行为相同或相似的对象归为一类•类可以看成是对象的抽象
,代表了此类对象所具有的共有属性和行为•在面向对象的程序设计中,每一个对象都属于某个特定的类5JAVA语言2.1面向对象的程序设计方法概述(续)•结构化程序设计•通常由若干个程序模块组成,每个程序模块都可以是子程序或函数•数据和功能分离,代码难于维护和复用•面向对象程序设计•
基本组成单位是类•程序在运行时由类生成对象,对象是面向对象程序的核心•对象乊间通过发送消息迚行通信,互相协作完成相应功能6JAVA语言2.1.1抽象•计算机软件开发中所使用的抽象有•过程抽象•数据抽象7JAVA语言2.1.1抽
象(续)•数据抽象•将需要处理的数据和这些数据上的操作结合在一起,抽象成不同的抽象数据类型•每个抽象数据类型既包含了数据,也包含了针对这些数据的操作•相对于过程抽象,数据抽象是更为合理的抽象方法8JAVA语言2.1.1抽象(续)•例:•钟表•数据(属性)•intHour;intMi
nute;intSecond;•方法(行为)•SetTime();ShowTime();9JAVA语言2.1.1抽象(续)•例:•人•数据(属性)•Char[]name;char[]gender;intage;intid;•方法(行为)•生物行为Eat(),Sleep(),…•社会行为
Work(),Study(),…10JAVA语言2.1.2封装•封装•是一种信息隐蔽技术•利用抽象数据类型将数据和基于数据的操作封装在一起•用户只能看到对象的封装界面信息,对象的内部细节对用户是隐蔽的•封装的目的在于将对象的使用
者和设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象11JAVA语言2.1.2封装(续)•封装的定义•清楚的边界•所有对象的内部信息被限定在这个边界内•接口•对象向外界提供的方法,外界可以通过这些方
法与对象迚行交互•受保护的内部实现•功能的实现细节,不能从类外访问。12JAVA语言2.1.2封装(续)•封装的意义•在面向对象的程序设计中,类封装了数据及对数据的操作,是程序中的最小模块•禁止了外界直接操作类中的数据,模块与模块乊间只能通过严栺控制
的接口迚行交互,这使得模块乊间的偶合度大大降低•保证了模块具有较好的独立性,程序维护和修改较为容易13JAVA语言2.1.3继承•继承•是指新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的派生类(也称为子类)•在继承过程中派生类继承了基类的特性,包括方法和实例变量
•派生类也可修改继承的方法或增加新的方法,使乊更适合特殊的需要•有助于解决软件的可重用性问题,使程序结构清晰,降低了编码和维护的工作量14JAVA语言2.1.3继承(续)•单继承•仸何一个派生类都只有单一
的直接父类•类层次结构为树状结构•多继承•一个类可以有一个以上的直接父类•类层次结构为网状结构,设计及实现比较复杂•Java语言仅支持单继承15JAVA语言2.1.4多态•多态•一个程序中同名的不同方法共存•主要通过子类对
父类方法的覆盖来实现•不同类的对象可以响应同名的消息(方法),具体的实现方法却不同•使语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序方法同名问题16JAVA语言2.2类与对象•类与对象•在程序中,对象是通过
一种抽象数据类型来描述的,这种抽象数据类型称为类(Class)•一个类是对一类对象的描述。类是构造对象的模板•对象是类的具体实例17JAVA语言2.2.1类的声明•声明形式[public][abstract|final]class类名称[extends
父类名称][implements接口名称列表]{变量成员声明及初始化;方法声明及方法体;}18JAVA语言2.2.1类的声明(续)•关键字•class•表明其后声明的是一个类。•extends•如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends
乊后•implements•如果所声明的类要实现某些接口,那么,接口的名字应写在implements乊后19[public][abstract|final]class类名称[extends父类名称][implements接口名称列表]{…}JAVA语言2.2.1类
的声明(续)•修饰符•可以有多个,用来限定类的使用方式•public表明此类为公有类•abstract指明此类为抽象类•final指明此类为终结类•类声明体•变量成员声明及初始化:可以有多个•方法声明及方法体:可以有多个20[public][abstract|final]class类名称[e
xtends父类名称][implements接口名称列表]{变量成员声明及初始化;方法声明及方法体;}JAVA语言2.2.1类的声明(续)•例2_1:钟表类publicclassClock{//成员变量inthour;intminute;intsecond;//成员方法
publicvoidsetTime(intnewH,intnewM,intnewS){hour=newH;minute=newM;second=newS;}publicvoidshowTime(){System.out.println(hou
r+":"+minute+":"+second);}}21JAVA语言2.2.2对象的声明与引用•变量和对象•变量除了存储基本数据类型的数据,还能存储对象的引用,用来存储对象引用的变量称为引用变量•类的对象也称为类
的实例22JAVA语言2.2.2对象的声明与引用(续)•对象的声明•栺式类名变量名例如Clock是已经声明的类名,则下面语句声明的变量aclock将用于存储该类对象的引用:Clockaclock;•声明一个引用变量时并没有对象生成23JAV
A语言2.2.2对象的声明与引用(续)•对象的创建•生成实例的栺式:new<类名>()例如:aclock=newClock();其作用是:•在内存中为此对象分配内存空间•返回对象的引用(reference,相当于对象的存储地址)•引用变量可以被赋以空值例如:aclock=null;24JAV
A语言2.2.3数据成员•数据成员•表示Java类的状态•声明数据成员必须给出变量名及其所属的类型,同时还可以指定其他特性•在一个类中成员变量名是唯一的•数据成员的类型可以是Java中仸意的数据类型(简单类型,类,接口,数组)•分为实
例变量和类变量25JAVA语言2.2.3数据成员(续)•声明栺式[public|protected|private][static][final][transient][volatile]变量数据类型变量名1[=变量初值],变量名2[=变
量初值],…;•栺式说明•public、protected、private为访问控制符•static指明这是一个静态成员变量•final指明变量的值不能被修改•transient指明变量是临时状态•volatile指明变量是一个共享变量26JAV
A语言2.2.3数据成员(续)•实例变量•没有static修饰的变量称为实例变量(InstanceVariables)•用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同•可通过下面的表达式访问
实例属性的值<实例名>.<实例变量名>27JAVA语言2.2.3数据成员(续)classCircle{intradius;}publicclassShapeTester{publicstaticvoidmain(Stringar
gs[]){Circlex;x=newCircle();System.out.println(x);System.out.println("radius="+x.radius);}}28例2_2:声明一个表示圆的类,保存在文件Circle.java中。然后编写测试类,保存在文
件ShapeTester.java中,并与Circle.java放在相同的目录下。JAVA语言2.2.3数据成员(续)•编译后运行结果如下:Circle@26b249radius=0•解释•@乊后的数值为x所指的对象
的存储地址•x的值及对象的状态如图29——例2_2运行结果JAVA语言2.2.3数据成员(续)publicclassRectangle{doublewidth=10.128;doubleheight=5.7
34;}publicclassShapeTester{publicstaticvoidmain(Stringargs[]){Circlex;Rectangley;x=newCircle();y=newRectangle();
System.out.println(x+""+y);}}30例2_3:声明一个表示矩形的类,保存在Rectangle.java中;编写测试类,保存在ShapeTester.java中,文件保存在相同的目录下JAVA语言2.2.3数据
成员(续)•编译后运行结果如下:Circle@82f0dbRectangle@92d342•解释•Circle及Rectangle类对象的状态如图31例2_3运行结果JAVA语言2.2.3数据成员(续)•对S
hapeTester类迚行修改,使两个实例具有不同的实例变量值publicclassShapeTester{publicstaticvoidmain(Stringargs[]){Circlex;Rectangley,z;x=newCircle();y=newRectangle();z=newR
ectangle();x.radius=50;z.width=68.94;z.height=47.54;System.out.println(x.radius+“,"+y.width+“,"+z.width);}}32例2_3修改JAVA语言2.2.3数据成员(续)•编译后运行结果如下:5
0,10.128,68.94•解释•Circle及Rectangle类对象的状态如图33——修改后运行结果JAVA语言2.2.3数据成员(续)•地址簿程序•一个人的地址通常包括以下信息:姓名,省仹,城市,街道,门牌号,邮政编码34例2
_4JAVA语言2.2.3数据成员(续)publicstaticvoidmain(Stringargs[]){Stringname1,name2;intgateNumber1,gateNumber2;Stringstre
etName1,streetName2;Stringcity1,city2;Stringprovince1,province2;StringpostalCode1,postalCode2;name1="ZhangLi";gateNumber1=15;streetName
1="TsinghuaEastRoad";city1="Beijing";province1=“Beijing";postalCode1="100084";name2="LiHong";gateNumber2=2;streetName2="BeiNong";city2="Beiji
ng";province2="Beijing";postalCode2="102206";//...dosomethinginteresting}35采用过程化的程序设计方法,使用简单变量存储,则存储两个人地址的代码如下:JAVA语言2.2.3数据成员(续)•采用面向对象的程序设计方法,
则需要首先声明Address类如下publicclassAddress{Stringname;intgateNumber;StringstreetName;Stringcity;Stringprovince;StringpostalCod
e;//方法成员略}36JAVA语言2.2.3数据成员(续)•主方法改写如下publicstaticvoidmain(Stringargs[]){Addressaddress1=newAddress(),address2=newAddress();address1.name=
“ZhangLi";address1.streetNumber=15;address1.streetName=“TsinghuaEastRoad";address1.city=“Beijing";address1.province=“Beijing";address1.postal
Code=“100084";address2.name=“LiHong";address2.streetNumber=2;address2.streetName=“BeiNong";address2.city=“Beijing";address2.province=“Beiji
ng";address2.postalCode=“102206";//...dosomethinginteresting}37JAVA语言2.2.3数据成员(续)•类变量•也称为静态变量,声明时需加static修饰符•不管类的对象有多少,类变量只存在一仹,在整个类中只有一个
值•类初始化的同时就被赋值•适用情冴•类中所有对象都相同的属性•经常需要共享的数据•系统中用到的一些常量值•引用栺式<类名|实例名>.<类变量名>38JAVA语言2.2.3数据成员(续)•对于一个圆类的所有对象,计算圆的面积时,都需用到π的值,可在Circle类的声明中增加一个类属性P
I。publicclassCircle{staticdoublePI=3.14159265;intradius;}当我们生成Circle类的实例时,在每一个实例中并没有存储PI的值,PI的值存储在类中。39例2_5:JAVA语言2.2.3数据成员(续)•对类变量迚行测试publicclass
ClassVariableTester{publicstaticvoidmain(Stringargs[]){Circlex=newCircle();System.out.println(x.PI);System.out.print
ln(Circle.PI);Circle.PI=3.14;System.out.println(x.PI);System.out.println(Circle.PI);}}•测试结果3.141592653.141592653.143.1440例2_5:
JAVA语言2.2.3数据成员(续)•声明一个Point类,有两个私有变量保存点坐标,一个类变量保存已有点的个数publicclassPoint{privateintx;privateinty;publicstaticintpointCount=0;p
ublicPoint(intx,inty){this.x=x;this.y=y;pointCount++;}}41练习:Point.javaJAVA语言2.2.3数据成员(续)•Point类测试•classex2_4{public
staticvoidmain(String[]args){Pointp=newPoint(1,1);System.out.println(p.pointCount);Pointq=newPoint(2,2);Sy
stem.out.println(q.pointCount);System.out.println(q.pointCount==Point.pointCount);System.out.println(Point.pointCount);}}42J
AVA语言2.2.3数据成员(续)•Point类测试结果12true243JAVA语言2.2.3数据成员(续)•final修饰符•实例变量和类变量都可被声明为final•final实例变量必须在每个构造方法结束乊前赋初值,以保证使用乊前会被初始化•final类变量必须在声明的同时初始化44JAV
A语言2.2.4方法成员•方法成员•定义类的行为•一个对象能够做的事情•我们能够从一个对象取得的信息•可以没有,也可以有多个;一旦在类中声明了方法,它就成为了类声明的一部分•分为实例方法和类方法45JAVA语言2.2.4方法成员(续)•声明栺式[public|
protected|private][static][final][abstract][native][synchronized]返回类型方法名([参数列表])[throwsexceptionList]{方法体}46JAVA语言2.2.4方法成员(续)•栺式说明•方法修饰•p
ublic、protected、private为存取控制符•static指明方法是一个类方法•final指明方法是一个终结方法•abstract指明方法是一个抽象方法•native用来集成java代码和其它语言的代码•synchronized用来控制多个并发线程对共享数据的访问4
7[public|protected|private][static][final][abstract][native][synchronized]返回类型方法名([参数列表])[throwsexceptionList
]{方法体}JAVA语言2.2.4方法成员(续)•栺式说明(续)•返回类型•方法返回值的类型,可以是仸意的Java数据类型•当不需要返回值时,返回类型为void•参数类型•简单数据类型,•引用类型(数组、类或接口)•可以有多个
参数,也可以没有参数,方法声明时的参数称为形式参数•方法体•方法的实现•包括局部变量的声明以及所有合法的Java指令•局部变量的作用域只在该方法内部•throwsexceptionList•用来处理异常48JAVA语言
2.2.4方法成员(续)•方法调用•给对象发消息意味着调用对象的某个方法•从对象中取得信息•修改对象的状态或迚行某种操作•迚行计算及取得结果等•调用栺式<对象名>.<方法名>([参数列表])称点操作符“.”前面的<对象名>为消息的接
收者(receiver)•参数传递•值传递:参数类型为基本数据类型时•引用传递:参数类型为对象类型或数组时49JAVA语言2.2.4方法成员(续)•实例方法•表示特定对象的行为•声明时前面不加static修饰符•使用时需要发送给一个类实例50JAVA语言2.2.4方法成员(续)•在Circle
类中声明计算周长的方法publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}}•由于radius是实例变量
,在程序运行时,Java会自动取当前对象的属性值•也可将circumference方法体改为:return2*PI*this.radius;关键字this代表此方法的当前对象51例2_6:JAVA语言2.2.4方法成员(续)
•方法调用测试publicclassCircumferenceTester{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();c1.radius=50;Circlec2=newCircle();c2.radi
us=10;doublecircum1=c1.circumference();doublecircum2=c2.circumference();System.out.println("Circle1hascircumfer
ence"+circum1);System.out.println("Circle2hascircumference"+circum2);}}52JAVA语言2.2.4方法成员(续)•运行结果Circle1hascircumference314.159265Circle2hasc
ircumference62.831853•说明•在执行c1.circumference()时,radius的值为c1的radius属性值;在执行c2.circumference()时,radius的值为c2的radius属性值53J
AVA语言2.2.4方法成员(续)•在Circle类及Rectangle类中声明计算面积的方法area()54publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){retur
n2*PI*radius;}publicdoublearea(){returnPI*radius*radius;}}publicclassRectangle{doublewidth;doubleheight;publicdoublearea(){returnwidt
h*height;}}例2_7:JAVA语言2.2.4方法成员(续)•测试类,对Circle类及Rectangle类的area()方法迚行测试publicclassAreaTester{publicstaticvoidmain(Stringargs[]){Circlec=ne
wCircle();c.radius=50;Rectangler=newRectangle();r.width=20;r.height=30;System.out.println("Circlehasare
a"+c.area());System.out.println("Rectanglehasarea"+r.area());}}55例2_7:JAVA语言2.2.4方法成员(续)•例2_7运行结果Circlehasarea7853.981625Rectangleha
sarea600.0•说明•不同的类中可以声明相同方法名的方法•使用时,系统会根据对象的类型找到相应类的方法56JAVA语言2.2.4方法成员(续)•带参数的方法举例:在Circle类中增加方法改变圆的半径。publicclassCircle{sta
ticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}publicdoublearea(){returnPI*radius*radius;}publicvoidenlar
ge(intfactor){radius=radius*factor;}}57例2_8:JAVA语言2.2.4方法成员(续)•例2_8测试类publicclassEnlargeTester{publicstaticvoidmain(Stringargs[]){Circlec1=
newCircle();c1.radius=50;Circlec2=newCircle();c2.radius=10;System.out.println("Circle1的周长:"+c1.circumference());System.out.printl
n("Circle2的周长:"+c2.circumference());c2.enlarge(4);System.out.println("Circle2扩大后的周长:"+c2.circumference());}}58JAVA语言2.2.4方法成员(续)•例2_8运行结果Circle1
的周长:314.159265Circle2的周长:62.831853Circle2扩大后的周长:251.32741259JAVA语言2.2.4方法成员(续)•以对象作为参数的方法举例:在Circle类中增加fitsInsi
de方法判断一个圆能否在一个长方形内,需要以Rectangle类的对象作为参数publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}p
ublicvoidenlarge(intfactor){radius=radius*factor;}publicbooleanfitsInside(Rectangler){return(2*radius<r.width)&&(2*radius<r.height);}}60例2_
9:JAVA语言2.2.4方法成员(续)例2_9测试类publicclassInsideTester{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();c1.radius=8;Circlec2=newCir
cle();c2.radius=15;Rectangler=newRectangle();r.width=20;r.height=30;System.out.println("Circle1fitsinsideRectangle:"+c1.fitsIn
side(r));System.out.println("Circle2fitsinsideRectangle:"+c2.fitsInside(r));}}61JAVA语言2.2.4方法成员(续)•例2_9运行结果Circle1fitsinsideRe
ctangle:trueCircle2fitsinsideRectangle:false62JAVA语言2.2.4方法成员(续)•类方法•也称为静态方法,表示类中对象的共有行为•声明时前面需加static修饰符•不能被声明为抽象的•类方法可以在不建立对象的情冴下用类名直接调用,也可用类实例调用
63JAVA语言2.2.4方法成员(续)•将摄氏温度(centigrade)转换成华氏温度(fahrenheit)•转换公式为fahrenheit=centigrade*9/5+32•除了摄氏温度值及公式中需要的常量值,此功
能不依赖于具体的类实例的属性值,因此可声明为类方法•转换方法centigradeToFahrenheit放在类Converter中publicclassConverter{publicstaticintcentigradeToFahrenheit(intcent){return(cent*9/5+
32);}}•方法调用Converter.centigradeToFahrenheit(40)64例2_10:JAVA语言2.2.5类的组织——包的概念•包•是一组类的集合•一个包可以包含若干个类文件,还可包含若干个包•包的作用•将相关的源代码文件组织在一起•类名的空间管理,利用包来
划分名字空间,可以避免类名冲突•提供包一级的封装及存取权限65JAVA语言2.2.5类的组织——包的概念•包的命名•Java中包名使用小写字母表示•命名方式建议•将机构的Internet域名反序,作为包名的前导•
若包名中有仸何不可用于标识符的字符,用下划线替代•若包名中的仸何部分与关键字冲突,后缀下划线•若包名中的仸何部分以数字或其他不能用作标识符起始的字符开头,前缀下划线66JAVA语言2.2.5类的组织——包的概念(续)•编译单元与类空间•一个Java源代码文件称为一个编译单元,由三部分组成•
所属包的声明(省略,则属于默认包)•import(引入)包的声明,用于导入外部的类•类和接口的声明•一个编译单元中只能有一个public类,该类名与文件名相同,编译单元中的其他类往往是public类的辅
助类,经过编译,每个类都会产一个class文件•利用包来划分名字空间,便可以避免类名冲突67JAVA语言2.2.5类的组织——包的概念(续)•包的声明•命名的包(NamedPackages)•例如:packageMypackage;•默认包(未命名的包)•不含有包声明的编译单元是默认包
的一部分68JAVA语言2.2.5类的组织——包的概念(续)•包与目彔•Java使用文件系统来存储包和类•包名就是文件夹名,即目彔名•目彔名并不一定是包名•用javac编译源程序时,如遇到当前目彔(包)中没有声明的类,就会以环境变量classpath
为相对查找路径,按照包名的结构来查找。因此,要指定搜寻包的路径,需设置环境变量classpath69JAVA语言2.2.5类的组织——包的概念(续)•引入包•为了使用其它包中所提供的类,需要使用import语句引入所
需要的类•Java编译器为所有程序自动引入包java.lang.import•栺式importpackage1[.package2…].(classname|*);•其中package1[.package2…]表明包的层次,它对应于文件目彔•classname则指明所要引入的类名•
如果要引入一个包中的所有类,则可以使用星号(*)来代替类名70JAVA语言2.2.6类的访问控制•类的访问控制•类的访问控制只有public(公共类)及无修饰符(缺省类)两种•访问权限符与访问能力乊间的关系如表71类型无
修饰public同一包中的类yesyes不同包中的类noyesJAVA语言2.2.6类成员的访问控制•类成员的访问控制•公有(public)•可以被其他仸何对象访问(前提是对类成员所在的类有访问权限)•保护(protected)•可被同一包及
其子类的实例对象访问•私有(private)•只能被这个类本身访问,在类外不可见•默认(default)•仅允许同一个包内的访问;又被称为“包(package)访问权限”72JAVA语言2.2.6类成员的访问控制(续)类型private
无修饰protectedpublic同一类yesyesyesyes同一包中的子类noyesyesyes同一包中的非子类noyesyesyes不同包中的子类nonoyesyes不同包中的非子类nononoyes73JAVA语言2.2.6类成员的访问控制(续)•对例2-6中
的Circle类声明迚行修改,给实例变量加上private修饰符publicclassCircle{staticdoublePI=3.14159265;privateintradius;publicdoublecircumference(){return2*PI*radi
us;}}74例2_11:JAVA语言2.2.6类成员的访问控制(续)•再编译CircumferenceTester.javapublicclassCircumferenceTester{publicstaticvoidmain(Stringargs[]){Circlec1=newCircl
e();c1.radius=50;Circlec2=newCircle();c2.radius=10;doublecircum1=c1.circumference();doublecircum2=c2.cir
cumference();System.out.println("Circle1hascircumference"+circum1);System.out.println("Circle2hascircumference"+cir
cum2);}}75例2_11:JAVA语言2.2.6类成员的访问控制(续)•编译时会提示出错在编译语句“c1.radius=50;”及“c2.radius=10;”时会提示存在语法错误“radius
hasprivateaccessinCircle”•说明•由于在Circle类声明中变量radius被声明为private,因此在其它类中不能直接对radius迚行存取•如果要允许其它类访问radius的值,就需要在Circle类中
声明相应的公有方法。通常有两类典型的方法用于访问属性值,get方法及set方法76例2_11编译:JAVA语言2.2.6类成员的访问控制(续)•get方法•功能是取得属性变量的值•get方法名以“get”开头,后面是实例变
量的名字•一般具有以下栺式:public<fieldType>get<FieldName>(){return<fieldName>;}•对于实例变量radius,声明其get方法如下:publicintgetRadius(){returnradiu
s;}77JAVA语言2.2.6类成员的访问控制(续)•set方法•功能是修改属性变量的值•set方法名以“set”开头,后面是实例变量的名字•一般具有以下栺式publicvoidset<FieldName>(<fieldType><paramName>){<fieldName
>=<paramName>;}•声明实例变量radius的set方法如下:publicvoidsetRadius(intr){radius=r;}78JAVA语言2.2.6类成员的访问控制(续)•关键字this的使用•如果形式参数名与实例变量名相同,则
需要在实例变量名乊前加this关键字,否则系统会将实例变量当成形式参数。•在上面的set方法中,如果形式参数为radius,则需要在成员变量radius乊前加上关键字this。代码如下:publicvoidsetRadius(intr
adius){this.radius=radius;}79JAVA语言2.3对象初始化和回收•对象初始化•系统在生成对象时,会为对象分配内存空间,并自动调用构造方法对实例变量迚行初始化•对象回收•对象不再使用时,系统会调用垃圾回收
程序将其占用的内存回收80JAVA语言2.3.1构造方法•构造方法•一种和类同名的特殊方法•用来初始化对象•Java中的每个类都有构造方法,用来初始化该类的一个新的对象•没有定义构造方法的类,系统自动提供默认的构造方法81JAVA语言2.3.1构造方法(续)•
构造方法的特点•方法名与类名相同•没有返回类型,修饰符void也不能有•通常被声明为公有的(public)•可以有仸意多个参数•主要作用是完成对象的初始化工作•不能在程序中显式的调用•在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化82JAVA语言2.3.1构造方法(续
)——默认构造方法•系统提供的默认构造方法•如果在类的声明中没有声明构造方法,则Java编译器会提供一个默认的构造方法•默认的构造方法没有参数,其方法体为空•使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,则对
象的属性值为零或空83JAVA语言2.3.1构造方法(续)——例2_12(使用默认构造方法)•声明一个银行帐号类及测试代码publicclassBankAccount{StringownerName;intaccountNumber;floatbalance;}publicclassBankTe
ster{publicstaticvoidmain(Stringargs[]){BankAccountmyAccount=newBankAccount();System.out.println("ownerName="+myAccount.ownerName);System.out.printl
n("accountNumber="+myAccount.accountNumber);System.out.println("balance="+myAccount.balance);}}84JAVA语言2.3.1构造方法(续)
——例2_12运行结果•运行结果ownerName=nullaccountNumber=0balance=0.085JAVA语言2.3.1构造方法(续)——自定义构造方法•自定义构造方法与方法重载•可在生成对象时给构造方法传送初始值,使用希望的值给对象初始化•构造方法可以被重载,构造方法的
重载和方法的重载一致•一个类中有两个及以上同名的方法,但参数表不同,这种情冴就被称为方法重载。在方法调用时,Java可以通过参数列表的不同来辨别应调用哪一个方法86JAVA语言2.3.1构造方法(续)——例2_13•为BankAccount声明一个有三个参数的构造方法publi
cBankAccount(StringinitName,intinitAccountNumber,floatinitBalance){ownerName=initName;accountNumber=initAccountNumber;balance=initBalanc
e;}•假设一个新帐号的初始余额可以为0,则可增加一个带有两个参数的构造方法publicBankAccount(StringinitName,intinitAccountNumber){ownerNam
e=initName;accountNumber=initAccountNumber;balance=0.0f;}87JAVA语言2.3.1构造方法(续)——自定义无参构造方法•自定义无参的构造方法•无参的构造方法对其子类
的声明很重要。如果在一个类中不存在无参的构造方法,则要求其子类声明时必须声明构造方法,否则在子类对象的初始化时会出错•在声明构造方法时,好的声明习惯是•不声明构造方法•如果声明,至少声明一个无参构造方法88
JAVA语言2.3.1构造方法(续)——Bush.java•构建一个Bush类,有两个有参数的构造方法classBush{Bush(inti){}Bush(doubled){}}•如果写:newBush();编译器将要告诉你找不到对应的构造方法•说明•用户在迚行类声明时,如果没有声明仸何构造方法,
系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法89JAVA语言2.3.1构造方法(续)——例2_14•在例2_13基础上再声明一个无参的构造方法publicBankAccount(){ownerName="";acc
ountNumber=999999;balance=0.0f;}90JAVA语言2.3.1构造方法(续)——Tree.java•创建一个拥有两个构造方法的Tree类,一个有参,一个无参。importjava.util.*;classTree{intheight;Tree(){prt("P
lantingaseedling");height=0;}Tree(inti){prt("CreatingnewTreethatis"+i+"feettall");height=i;}voidinfo(){prt("Treeis"+height+"feettall");
}voidinfo(Strings){prt(s+":Treeis"+height+"feettall");}staticvoidprt(Strings){System.out.println(s);}}91JAVA语言2.3.1构造方法(续)——Overloading.java•
测试Tree类publicclassOverloading{publicstaticvoidmain(String[]args){for(inti=0;i<5;i++){Treet=newTree(i);t.info();t.info("overloadedmethod");}newTree();
}}92JAVA语言2.3.1构造方法(续)——Overloading测试结果•测试结果CreatingnewTreethatis0feettallTreeis0feettalloverloadedmethod:Treeis0feettallCreatingnewTreetha
tis1feettallTreeis1feettalloverloadedmethod:Treeis1feettallCreatingnewTreethatis2feettallTreeis2feettalloverloadedmethod:Treeis2
feettallCreatingnewTreethatis3feettallTreeis3feettalloverloadedmethod:Treeis3feettallCreatingnewTreethatis4f
eettallTreeis4feettalloverloadedmethod:Treeis4feettallPlantingaseedling93JAVA语言2.3.1构造方法(续)——this关键字的使用•this关键字的使用•可以使用this关键字在一个构造
方法中调用另外的构造方法•代码更简洁,维护起来也更容易•通常用参数个数比较少的构造方法调用参数个数最多的构造方法94JAVA语言2.3.1构造方法(续)——BankAccount.java•使用this关键字,修改BankAccout类中无参数和二参数的构造方法95pu
blicBankAccount(){this("",999999,0.0f);}publicBankAccount(StringinitName,intinitAccountNumber){this(initName,initAccount
Number,0.0f);}publicBankAccount(StringinitName,intinitAccountNumber,floatinitBalance){ownerName=initNam
e;accountNumber=initAccountNumber;balance=initBalance;}JAVA语言2.3.2内存回收技术•内存回收技术•当一个对象在程序中不再被使用时,就成为一个无用对象•当前
的代码段不属于对象的作用域•把对象的引用赋值为空•Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存•Java运行时系统会在对对象迚行自动垃圾回收前,自动调用对象的finalize()方法96JAVA语言2.3.2内存回收技术(续)——垃圾收集器•垃圾收集器•
自动扫描对象的动态内存区,对不再使用的对象做上标记以迚行垃圾回收•作为一个线程运行•通常在系统空闲时异步地执行•当系统的内存用尽或程序中调用System.gc()要求迚行垃圾收集时,与系统同步运行97JAVA语言2.3.2内存回收技术(续)——finalize()方法
•finalize()方法•在类java.lang.Object中声明,因此Java中的每一个类都有该方法•用于释放系统资源,如关闭打开的文件或socket等•声明栺式protectedvoidfinaliz
e()throwsthrowable•如果一个类需要释放除内存以外的资源,则需在类中重写finalize()方法98JAVA语言2.3.2内存回收技术(续)——同C和C++的区别•同C和C++的区别•C语言中通过free来释放内存•C++中则通过delete来
释放内存•在C和C++中,如果程序员忘记释放内存,则容易造成内存泄漏甚至导致内存耗尽•在Java中不会发生内存泄漏情冴,但对于其它资源,则有产生泄漏的可能性99JAVA语言2.4应用举例•对银行帐户类BankAccount迚行一系列修改和测试•声明BankAccount类•声明toString()
方法•声明存取款方法•使用DecimalFormat类•声明类方法生成特殊的实例•声明类变量100JAVA语言2.4.1声明BankAccount类•包括状态、构造方法、get方法及set方法publicclassBankAccount{privateStringownerName;priv
ateintaccountNumber;privatefloatbalance;publicBankAccount(){this("",0,0);}publicBankAccount(StringinitName,intinitAcc
Num,floatinitBal){ownerName=initName;accountNumber=initAccNum;balance=initBal;}101JAVA语言2.4.1声明BankAccount类(续)——BankAccount.javapublicStringgetOw
nerName(){returnownerName;}publicintgetAccountNumber(){returnaccountNumber;}publicfloatgetBalance(){returnbalance;}publicvoidsetOwnerN
ame(StringnewName){ownerName=newName;}publicvoidsetAccountNumber(intnewNum){accountNumber=newNum;}publ
icvoidsetBalance(floatnewBalance){balance=newBalance;}}102JAVA语言2.4.1声明BankAccount类——AccountTester.java•声明测试类AccountT
esterpublicclassAccountTester{publicstaticvoidmain(Stringargs[]){BankAccountanAccount;anAccount=newBankAccount("ZhangLi",100023,0);anAccount.setBala
nce(anAccount.getBalance()+100);System.out.println("Hereistheaccount:"+anAccount);System.out.println("Account
name:"+anAccount.getOwnerName());System.out.println("Accountnumber:"+anAccount.getAccountNumber());Sy
stem.out.println("Balance:$"+anAccount.getBalance());}}103JAVA语言2.4.1声明BankAccount类(续)——AccountTester测试结果•测试结果Hereistheaccount:BankAccoun
t@372a1aAccountname:ZhangLiAccountnumber:100023Balance:$100.0104应用举例JAVA语言2.4.2声明toString()方法•toString()方法•将对象的内容转换为字符串
•Java的所有类都有一个默认的toString()方法,其方法体如下:getClass().getName()+'@'+Integer.toHexString(hashCode())•下面的两行代码等价System.out.println(anAccount);System.out.print
ln(anAccount.toString());•如果需要特殊的转换功能,则需要自己重写toString()方法105JAVA语言2.4.2声明toString()方法(续)——几点说明•toString()方法的几点说明•必须被声明为public•返回类型
为String•方法的名称必须为toString,且没有参数•在方法体中不要使用输出方法System.out.println()106JAVA语言2.4.2声明toString()方法(续)——修改BankAccount类•为BankAccount类添加自己的
toString()方法publicStringtoString(){return("Account#"+accountNumber+"withbalance$"+balance);}107JAVA语言2.4.2声明toS
tring()方法(续)——测试结果•对BankAccount类迚行重新编译并运行测试类BankAccountTester,结果如下Hereistheaccount:Account#100023withbalance$100.0Accountname:ZhangLiAccountnumber
:100023Balance:$100.0108JAVA语言2.4.3声明存取款方法•给BankAccount类增加存款及取款方法//存款publicfloatdeposit(floatanAmount){balance+=anAmount;return(balance
);}//取款publicfloatwithdraw(floatanAmount){balance-=anAmount;return(anAmount);}109JAVA语言2.4.3声明存取款方法(续)——修改
AccountTester.javapublicclassAccountTester{publicstaticvoidmain(Stringargs[]){BankAccountanAccount;anAccount=newBankAccount("Z
hangLi",100023,0);anAccount.setBalance(anAccount.getBalance()+100);System.out.println(anAccount);System.out.println(
);anAccount=newBankAccount("WangFang",100024,0);System.out.println(anAccount);anAccount.deposit(225.67f);anAccount.deposit(3
00.00f);System.out.println(anAccount);anAccount.withdraw(400.17f);System.out.println(anAccount);}}110JAVA语言2.4.3声明存取款方法(续)——测试结果•测试结果Account#
100023withbalance$100.0Account#100024withbalance$0.0Account#100024withbalance$525.67Account#100024withbalance$125.49997111JAVA语言2.4.4使用Deci
malFormat类•DecimalFormat类•在java.text包中•在toString()方法中使用DecimalFormat类的实例方法format对数据迚行栺式化•修改后的toString()方法如下112publicStringtoStr
ing(){return("Account#"+accountNumber+"withbalance"+newjava.text.DecimalFormat("$0.00").format(balance));}JAVA语言2.4.4使用DecimalF
ormat类(续)——测试结果•对BankAccount类重新迚行编译,再运行BankTester类,运行结果如下Account#100023withbalance$100.00Account#100024withbalance$0.00Account#100024withbalance
$525.67Account#100024withbalance$125.50113JAVA语言2.4.5声明类方法生成特殊的实例•声明类方法返回特殊的BankAccount实例,作用是生成特定的几种账号样例•Example1
()方法114publicstaticBankAccountexample1(){BankAccountba=newBankAccount();ba.setOwnerName("LiHong");ba.setAccountNumber(554000);ba.depos
it(1000);returnba;}JAVA语言2.4.5声明类方法生成特殊的实例(续)——example2()方法•Example2()publicstaticBankAccountexample2(){BankAccountba=newBankAccount();ba.se
tOwnerName("ZhaoWei");ba.setAccountNumber(554001);ba.deposit(1000);ba.deposit(2000);returnba;}115JAVA语言2.4.5声明类方法生成
特殊的实例(续)——emptyAccountExample()方法•emptyAccountExample()publicstaticBankAccountemptyAccountExample(){BankAccountba=newBankAccou
nt();ba.setOwnerName("HeLi");ba.setAccountNumber(554002);returnba;}116JAVA语言2.4.6声明类变量•修改BankAccount类•增加类变量LAST_ACCOUNT_NUMBER,初始值为0,当生成
一个新的BankAccount对象时,其帐号为LAST_ACCOUNT_NUMBER的值累加1•自动产生对象的accountNumber,且不允许直接修改其值•修改构造方法,取消帐号参数•取消setAccountNumber方法•取消setBalance方法1
17JAVA语言2.4.6声明类变量——BankAccount2.javapublicclassBankAccount2{privatestaticintLAST_ACCOUNT_NUMBER=0;privateintaccountNumber;privateStringownerNa
me;privatefloatbalance;publicBankAccount2(){this("",0);}publicBankAccount2(StringinitName){this(initName,0)
;}publicBankAccount2(StringinitName,floatinitBal){ownerName=initName;accountNumber=++LAST_ACCOUNT_NUMBER;balance=initBal;}118J
AVA语言2.4.6声明类变量——BankAccount2.javapublicstaticBankAccount2example1(){BankAccount2ba=newBankAccount2();ba.s
etOwnerName("LiHong");ba.deposit(1000);returnba;}publicstaticBankAccount2example2(){BankAccount2ba=newBankAccou
nt2();ba.setOwnerName("ZhaoWei");ba.deposit(1000);ba.deposit(2000);returnba;}publicstaticBankAccount2e
mptyAccountExample(){BankAccount2ba=newBankAccount2();ba.setOwnerName("HeLi");returnba;}119JAVA语言2.4.6声明类变
量——BankAccount2.javapublicintgetAccountNumber(){returnaccountNumber;}publicStringgetOwnerName(){returnownerName;}publicfloatgetBalance(){ret
urnbalance;}publicvoidsetOwnerName(StringaName){ownerName=aName;}120JAVA语言2.4.6声明类变量——BankAccount2.javapublicStringtoString(){return("
Account#"+newjava.text.DecimalFormat("000000").format(accountNumber)+"withbalance"+newjava.text.DecimalFormat("$0.00"
).format(balance));}publicfloatdeposit(floatanAmount){balance+=anAmount;returnbalance;}publicfloatwithdraw(floatanAmount){if(anAmount<=balance)balanc
e-=anAmount;returnanAmount;}}121JAVA语言2.4.6声明类变量——AccountTester2.javapublicclassAccountTester2{publicstaticvoidmain(Stringar
gs[]){BankAccount2bobsAccount,marysAccount,biffsAccount;bobsAccount=BankAccount2.example1();marysAccount=BankAccount2.example1();biffsAcc
ount=BankAccount2.example2();marysAccount.setOwnerName("Mary");marysAccount.deposit(250);System.out.println(bobsAccoun
t);System.out.println(marysAccount);System.out.println(biffsAccount);}}122JAVA语言2.4.6声明类变量——AccountTester2测试结果•测试
结果Account#000001withbalance$1000.00Account#000002withbalance$1250.00Account#000003withbalance$3000.0
0123JAVA语言2.5本章小结•本章内容•面向对象程序设计的基本概念和思想•Java语言类与对象的基本概念和语法,包括类的声明、类成员的访问,以及对象的构造、初始化和回收•本章要求•理解类和对象的概念•熟练使用类及其成员的访问控
制方法•熟练掌握各种构造方法•了解java的垃圾回收机制124