类与对象的基本概念_第1页
类与对象的基本概念_第2页
类与对象的基本概念_第3页
类与对象的基本概念_第4页
类与对象的基本概念_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

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

文档简介

1、1第第二二章章类类与与对象对象的基本概念的基本概念JAVA语言程序设计JAVA语言程序设计2目录目录2.1 类与对象类与对象2.2 对象初始化和回收对象初始化和回收 2.3 应用举例应用举例 2.4 本章小节本章小节JAVA语言程序设计3l类与对象类与对象的概念的概念真正理解掌握真正理解掌握 在程序中,对象(具体的、实在的、变量的)是通过一种抽象数据类型(ADT)来描述的,这种抽象数据类型称为类(抽象的、共性的、类型的) 一个类是对一类对象的描述。类是构造对象的模板 一个对象是某个类的具体实例2.1 类与对象类与对象JAVA语言程序设计42.1.1 类的类的声明声明ADT类型定义类型定义l声明

2、形式声明形式public abstract | final class 类名称类名称 extends 父类名称父类名称 implements 接口名称列表接口名称列表 成员变量声明及初始化;成员变量声明及初始化; 成员方法声明及方法体;成员方法声明及方法体;l思考:类声明的思考:类声明的作用作用,需要定义哪些,需要定义哪些内容内容,需要明,需要明确哪些确哪些限制限制?JAVA语言程序设计5l关键字关键字 classl表明其后声明的是一个类。 extendsl如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后 implementsl如果所声明的类要实现某些接口,那么,接

3、口的名字应写在implements之后2.1.1 类的声明类的声明类与对象JAVA语言程序设计6l修饰符修饰符 可以有多个,用来限定类的使用方式 publicl表明此类为公有类 abstractl指明此类为抽象类 finall指明此类为终结类 l类体类体 成员变量声明及初始化l可以有多个 成员方法声明及方法体l可以有多个2.1.1 类的声明类的声明类与对象JAVA语言程序设计7l钟表类钟表类 思考:该类分装了时分秒状态属性和设置时间、思考:该类分装了时分秒状态属性和设置时间、显示时间的功能方法显示时间的功能方法public class Clock / 成员变量成员变量 int hour ; i

4、nt minute ; int 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.1.1 类的声明类的声明 例例2_1类与对象JAVA语言程序设计8l变量和对象变量和对象说出你对变量和对象的理解说出你对变量和对象的理解 变量除了存储基本数据类型的数据,还能存储对象的引用,用来存储对象引用的变

5、量称为引用变量 类的对象也称为类的实例,对象实例存储在内存中,由引用变量(对象变量)来标识2.1.2 对象的对象的声明与引用声明与引用类与对象JAVA语言程序设计9l对象的对象的声明声明 格式类名 变量名 例如Clock是已经声明的类名,则下面语句声明的变量aclock将用于存储该类对象的引用: Clock aclock; 声明一个对象变量时并没有真正的创建对象实例,只是声明了一个存放对象引用的变量 注意:一般我们把对象(引用)变量直接简称为某对象2.1.2 对象的声明与引用对象的声明与引用类与对象JAVA语言程序设计10l对象的对象的创建创建 生成实例的格式:new () 例如: acloc

6、k=new Clock()其作用是:l在内存中为此对象的实例分配内存空间l返回对象的引用(reference ,相当于对象的存储地址) 对象变量可以被赋以空值例如:aclock=null;2.1.2 对象的声明与引用对象的声明与引用类与对象JAVA语言程序设计11l本节重点:本节重点: 理解对象变量及其中值的含义 对象的内存模型 a.声明对象变量时的内存模型 b.创建对象实例时的内存模型阅读:P61:3.对象的内存模型(5mins) 使用对象:对象引用与对象实例的关联例如:aclock=null;阅读:P63:4.3.3使用对象(5mins)2.1.2 对象的声明与引用对象的声明与引用类与对象

7、JAVA语言程序设计122.1.3 数据成员数据成员成员变量,理解内存后快速成员变量,理解内存后快速l数据成员数据成员表示Java类的状态声明数据成员必须给出变量名及其所属的类型,同时还可以指定其他特性在一个类中成员变量名是唯一的数据成员的类型可以是Java中任意的数据类型(简单类型,类,接口,数组)分为实例变量和类变量类与对象JAVA语言程序设计13 声明格式格式有很多,这里是成员变量的格式,思考有哪些?public | protected | private static final变量数据类型变量数据类型 变量名变量名1=变量初值变量初值, 变量名变量名2=变量初值变量初值, ; 格式说

8、明lpublic、protected、private 为访问控制符lstatic指明这是一个静态成员变量lfinal指明变量的值不能被修改2.1.3 数据成员数据成员类 与 对 象JAVA语言程序设计14l实例成员变量实例成员变量结合对象实例的存储,真正理解结合对象实例的存储,真正理解 形式:没有static修饰的变量称为实例变量(Instance Variables) 作用:用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同 应用:可通过下面的表达式访问实例属性的值.2.1.3 数据成员数据成员实例成员变量实例成员变量类与对象JAVA语言程序设计15l声明一个表示圆的类,保存在文件

9、声明一个表示圆的类,保存在文件Circle.java 中。中。然后编写测试类,保存在文件然后编写测试类,保存在文件ShapeTester.java中,并与中,并与Circle.java放在相同的目录下放在相同的目录下public class Circle int radius; public class ShapeTester public static void main(String args) Circle x; x = new Circle(); System.out.println(x); System.out.println(radius = + x.radius); 2.1.3

10、数据成员数据成员例例2_2类与对象思考:x可否换成Circle?JAVA语言程序设计16l编译后运行结果如下:编译后运行结果如下:Circle26b249radius =0l解释解释 之后的数值为x所指的对象的存储地址 x的值及对象的状态如图2.1.3 数据成员数据成员例例2_2运行结果运行结果类与对象对象变量x内存中是引用值对象实例的成员变量内存中是各具体状态值JAVA语言程序设计17l强化练习强化练习:声明一个表示矩形的类:声明一个表示矩形的类,保存在保存在Rectangle.java中;编写测试类,保存在中;编写测试类,保存在ShapeTester.java中,二文件保存在相同的目录下中

11、,二文件保存在相同的目录下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.println(x + + y); 2.1.3 数据成员数据成员例例2_3类与对象思考:结果是什么,对象及实例的内存模型如何?JAVA语言程序设计1

12、8l编译后运行结果如下:编译后运行结果如下:Circle82f0db Rectangle92d342l解释解释 Circle及Rectangle类对象的状态如图2.1.3 数据成员数据成员例例2_3运行结果运行结果类与对象JAVA语言程序设计19l强化练习:强化练习:对对ShapeTester类进行修改,使两个实例具有类进行修改,使两个实例具有不同的实例变量值不同的实例变量值public class ShapeTester public static void main(String args) Circle x; Rectangle y, z; x = new Circle(); y = n

13、ew 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.1.3 数据成员数据成员例例2_3修改修改类与对象2个new得到两个不同的实例JAVA语言程序设计20l编译后运行结果如下:编译后运行结果如下:50 10.128 68.94l解释解释 Circle及Rectangle类对象的状态如图2.1.3 数据成员数据成员修改后运行结果修改后运行结果类与对象JAVA语言程序

14、设计21l类变量类变量理解掌握,对比思考类变量的含义及用途理解掌握,对比思考类变量的含义及用途形式(严格):也称为静态变量,声明时需加static修饰符存储:不管类的对象有多少,类变量只存在一份,在整个类中只有一个值特点:类初始化的同时就被赋值 适用情况l类中所有对象都相同的属性l经常需要共享的数据l系统中用到的一些常量值 引用格式.2.1.3 数据成员数据成员类变量类变量(暂缓,转方法成员)(暂缓,转方法成员)类与对象JAVA语言程序设计22l对于一个圆类的所有对象,计算圆的面积对于一个圆类的所有对象,计算圆的面积时,都需用到时,都需用到的值,可在的值,可在Circle类的声明类的声明中增加

15、一个类属性中增加一个类属性PIpublic class Circle static double PI = 3.14159265; int radius; 当我们生成Circle类的实例时,在每一个实例中并没有存储PI的值,PI的值存储在类中2.1.3 数据成员数据成员例例2_5类与对象JAVA语言程序设计23 对类变量进行测试public class ClassVariableTester public static void main(String args) Circle x = new Circle(); System.out.println(x.PI); System.out.pri

16、ntln(Circle.PI); Circle.PI = 3.14; System.out.println(x.PI); System.out.println(Circle.PI); 测试结果3.141592653.1415926.3 数据成员数据成员例例2_5运行结果运行结果类与对象JAVA语言程序设计24l声明一个声明一个Point类,有两个私有变量保存类,有两个私有变量保存点点坐标坐标,一个,一个类变量保存已有点的个数类变量保存已有点的个数public class Point private int x; private int y; public static

17、int pointCount=0; public Point(int x, int y) this.x = x; this.y = y; pointCount+;2.1.3 数据成员数据成员Point.java类与对象JAVA语言程序设计25l测试类测试类ex2_4(略)(略) 转类方法转类方法class 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); System.out.printl

18、n(q.pointCount); System.out.println(q.pointCount = Point.pointCount); System.out.println(Point.pointCount);2.1.3 数据成员数据成员Point类测试类测试类与对象JAVA语言程序设计26l测试结果测试结果12true2 2.1.3 数据成员数据成员Point类测试结果类测试结果类与对象JAVA语言程序设计27l实例变量和类变量都可被声明为实例变量和类变量都可被声明为finallfinal实例变量必须在每个构造方法结实例变量必须在每个构造方法结束之前赋初值,以保证使用之前会被束之前赋初值

19、,以保证使用之前会被初始化初始化lfinal类变量必须在声明的同时初始化类变量必须在声明的同时初始化2.1.3 数据成员数据成员final修饰符修饰符类与对象JAVA语言程序设计282.1.4 方法成员方法成员成员方法或成员函数成员方法或成员函数l方法成员方法成员 定义类的功能和行为 可以没有,也可以有多个;一旦在类中声明了方法,它就成为了类声明的一部分 分为实例方法和类方法 可分为构造函数和普通成员函数 可以限定为不同的访问权限类与对象JAVA语言程序设计29方法定义public | protected | private static finalabstract返回类型返回类型 方法名方法

20、名(参数列表参数列表) throws exceptionList方法体方法体2.1.4 方法成员方法成员声明格式声明格式类与对象思考:普通函数含义及其几个要素JAVA语言程序设计30格式说明l方法修饰public、protected、private 为存取控制符static指明方法是一个类方法final指明方法是一个终结方法abstract指明方法是一个抽象方法2.1.4 方法成员方法成员格式说明格式说明类与对象JAVA语言程序设计31 格式说明l返回类型 方法返回值的类型,可以是任意的Java数据类型 当不需要返回值时,返回类型为voidl参数类型 简单数据类型, 引用类型(数组、类或接口)

21、 可以有多个参数,也可以没有参数,方法声明时的参数称为形式参数l方法体 方法的实现(对比抽象的空函数) 包括局部变量的声明以及所有合法的Java指令 局部变量(区分成员变量)的作用域只在该方法内部lthrows exceptionList 用来处理异常2.1.4 方法成员方法成员格式说明格式说明类与对象JAVA语言程序设计32l方法方法调用调用 给对象发消息(消息编程)意味着调用对象的某个方法l从该对象中取得信息(以对象引用为参数,取得对应实例的信息) l修改对象的状态或进行某种操作 l进行计算及取得结果等 调用格式.(参数列表)称点操作符“.”前面的为消息的接收者(receiver) 参数传

22、递l值传递:参数类型为基本数据类型时l引用传递:参数类型为对象类型或数组时2.1.4 方法成员方法成员方法调用方法调用类与对象JAVA语言程序设计33l 实例方法实例方法 含义:表示特定对象的行为,调用函数时离不开具体的对象实例 形式:声明时前面不加static修饰符2.1.4 方法成员方法成员实例方法实例方法类与对象JAVA语言程序设计34l在在Circle类中声明类中声明计算周长计算周长的方法的方法 public class Circle static double PI = 3.14159265; /类变量 int radius; /实例变量public double circumfer

23、ence() /实例方法 return 2 * PI * radius; /两类变量皆可用 由于radius是实例变量,在程序运行时,Java会自动取其接收者对象(特定实例)的属性值 也可将circumference方法体改为:return 2 * PI * this.radius; 关键字this代表此方法的接收者对象(初识this,记:谁调用方法就代表谁)2.1.4 方法成员方法成员例例2_6类与对象JAVA语言程序设计35l方法调用测试方法调用测试public class CircumferenceTester public static void main(String args) C

24、ircle c1 = new Circle(); c1.radius = 50; Circle c2 = new Circle(); c2.radius = 10; double circum1 = c1.circumference(); /c1调用实例方法 double circum2 = c2.circumference(); /c2调用实例方法 System.out.println(Circle 1 has circumference + circum1); System.out.println(Circle 2 has circumference + circum2); 2.1.4 方

25、法成员方法成员例例2_6类与对象思考:x可否换成Circle?JAVA语言程序设计36l运行结果运行结果Circle 1 has circumference 314.159265Circle 2 has circumference 62.831853l说明说明 在使用实例方法时,需要将其发送给一个实例对象(也称给对象发送一条消息),radius的值(只有创建实例后才有内容)即是接收者对象的值 在执行c1.circumference()时,radius的值为c1的radius属性值;在执行c2.circumference()时,radius的值为c2的radius属性值类与对象2.1.4 方法成

26、员方法成员例例2_6运行结果运行结果JAVA语言程序设计37l强化练习强化练习(略略):在在Circle类及类及Rectangle类中声明类中声明计算面积的方法计算面积的方法area()2.1.4 方法成员方法成员例例2_7public class Circle static double PI = 3.14159265; int radius; public double circumference() return 2 * PI * radius; public double area() return PI * radius * radius; public class Rectangl

27、e double width; double height; public double area() return width * height; JAVA语言程序设计38l声明测试类,对声明测试类,对Circle类及类及Rectangle类的类的area()方法进方法进行测试行测试 public class AreaTester public static void main(String args) Circle c = new Circle(); c.radius = 50; Rectangle r = new Rectangle(); r.width = 20; r.height =

28、 30; System.out.println(Circle has area + c.area(); System.out.println(Rectangle has area + r.area(); 类与对象2.1.4 方法成员方法成员例例2_7JAVA语言程序设计39l运行结果运行结果Circle has area 7853.981625Rectangle has area 600.0l说明说明 不同的类中可以声明相同方法名的方法 使用时,系统会根据接收者对象的类型找到相应类的方法2.1.4 方法成员方法成员例例2_7运行结果运行结果类与对象JAVA语言程序设计40l思考比较:思考比较:

29、带参数的方法举例:在带参数的方法举例:在Circle类中增加类中增加方法改变圆的半径方法改变圆的半径public class Circle static double PI = 3.14159265; int radius; public double circumference() return 2 * PI * radius; public double area() return PI * radius * radius; public void enlarge(int factor) radius = radius * factor; 2.1.4 方法成员方法成员例例2_8类与对象思考

30、:该方法可否改为带参数?JAVA语言程序设计41l测试类测试类public class EnlargeTester public static void main(String args) Circle c1 = new Circle(); c1.radius = 50; Circle c2 = new Circle(); c2.radius = 10; System.out.println(Circle 1 的周长: + c1.circumference(); System.out.println(Circle 2 的周长: + c2.circumference(); c2.enlarge(

31、4); System.out.println(Circle 2 扩大后的周长: + c2.circumference(); 2.1.4 方法成员方法成员例例2_8类与对象JAVA语言程序设计42l运行结果运行结果Circle 1 的周长: 314.159265Circle 2 的周长: 62.831853Circle 2 扩大后的周长: 251.3274122.1.4 方法成员方法成员例例2_8运行结果运行结果类与对象JAVA语言程序设计43l练习(练习(略略):以对象作为参数的方法举例:在):以对象作为参数的方法举例:在Circle类中增加类中增加fitsInside方法判断一个圆是否在一方

32、法判断一个圆是否在一个长方形内,需要以个长方形内,需要以Rectangle类的对象作为参数类的对象作为参数public class Circle static double PI = 3.14159265; int radius; 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

33、 * radius P64 4.7访问权限2.1.7 类成员的访问控制类成员的访问控制类与对象JAVA语言程序设计59类型类型private无修饰无修饰protectedpublic同一类同一类yesyesyesyes同一包中的同一包中的子类子类noyesyesyes同一包中的同一包中的非子类非子类noyesyesyes不同包中的不同包中的子类子类nonoyesyes不同包中的不同包中的非子类非子类nononoyes2.1.7 类成员的访问控制类成员的访问控制类与对象JAVA语言程序设计60l对例对例2-6中的中的Circle类声明进行修改,给实类声明进行修改,给实例变量加上例变量加上priv

34、ate修饰符修饰符public class Circle static double PI = 3.14159265; private int radius; public double circumference() return 2 * PI * radius; 2.1.7 类成员的访问控制类成员的访问控制例例2_11类与对象JAVA语言程序设计61l再编译再编译CircumferenceTester.javapublic class CircumferenceTester public static void main(String args) Circle c1 = new Circl

35、e(); c1.radius = 50; Circle c2 = new Circle(); c2.radius = 10; double circum1 = c1.circumference(); double circum2 = c2.circumference(); System.out.println(Circle 1 has circumference + circum1); System.out.println(Circle 2 has circumference + circum2); 2.1.7 类成员的访问控制类成员的访问控制例例2_11类与对象JAVA语言程序设计62l编译

36、时会提示出错编译时会提示出错在编译语句“c1.radius = 50;”及“c2.radius =10;”时会提示存在语法错误“radius has private access in Circle”l说明说明 由于在Circle类声明中变量radius被声明为private,因此在其它类中不能直接对radius进行存取 如果要允许其它类访问radius的值,就需要在Circle类中声明相应的公有方法。通常有两类典型的方法用于访问属性值,get方法及set方法2.1.7 类成员的访问控制类成员的访问控制例例2_11编译编译类与对象JAVA语言程序设计63lget方法方法 功能是取得属性变量的值

37、 get方法名以“get”开头,后面是实例变量的名字 一般具有以下格式:public get() return ; 对于实例变量radius,声明其get方法如下:public int getRadius() return radius; 2.1.7 类成员的访问控制类成员的访问控制get方法方法类与对象JAVA语言程序设计64lset方法方法 功能是修改属性变量的值 set方法名以“set”开头,后面是实例变量的名字 一般具有以下格式public void set( ) = ; 声明实例变量radius的set方法如下:public void setRadius(int r) radius

38、= r;2.1.7 类成员的访问控制类成员的访问控制set方法方法类与对象JAVA语言程序设计65l关键字关键字this的使用的使用 如果形式参数名与实例变量(成员变量)名相同,则需要在实例变量名之前加this关键字,否则系统会将实例变量当成形式参数。 在上面的set方法中,如果形式参数为radius,则需要在成员变量radius之前加上关键字this。代码如下:public void setRadius(int radius) this.radius = radius; 2.1.7 类成员的访问控制类成员的访问控制set方法方法类与对象JAVA语言程序设计66l本节重点:本节重点: 构造方法

39、与方法重载 包(加深理解和掌握) 访问权限2类与对象类与对象JAVA语言程序设计672.2 对象初始化和回收对象初始化和回收l对象初始化对象初始化 系统在生成对象时,会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化l对象回收对象回收 对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收JAVA语言程序设计682.2.1 构造方法构造方法(简)(简)l构造方法构造方法 一种和类同名的特殊方法 用来初始化对象 Java中的每个类都有构造方法,用来初始化该类的一个新的对象 没有定义构造方法的类,系统自动提供默认的构造方法对象初始化和回收JAVA语言程序设计69l构造方法的特点构造方法

40、的特点 方法名与类名相同 没有返回类型,修饰符void也不能有 通常被声明为公有的(public) 可以有任意多个参数 主要作用是完成对象的初始化工作 不能在程序中显式的调用 在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化2.2.1 构造方法构造方法对象初始化和回收JAVA语言程序设计70l系统提供的系统提供的默认构造方法默认构造方法 如果在类的声明中没有声明构造方法,则Java编译器会提供一个默认的构造方法 默认的构造方法没有参数,其方法体为空 使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,则对象的属性值为零或空对象初始化和回收2.2.1 构造方法构

41、造方法默认构造方法默认构造方法JAVA语言程序设计71l声明一个银行帐号类及测试代码声明一个银行帐号类及测试代码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.

42、println(accountNumber= + myAccount.accountNumber); System.out.println(balance= + myAccount.balance);2.2.1 构造方法构造方法例例2_12(使用默认构造方法)(使用默认构造方法)对象初始化和回收JAVA语言程序设计72l运行结果运行结果ownerName=nullaccountNumber=0balance=0.0对象初始化和回收2.2.1 构造方法构造方法例例2_12运行结果运行结果JAVA语言程序设计73l自定义构造方法自定义构造方法与与方法重载方法重载 可在生成对象时给构造方法传送初始值

43、,使用希望的值给对象初始化 构造方法可以被重载,构造方法的重载和方法的重载一致 一个类中有两个及以上同名的方法,但参数表不同,这种情况就被称为方法重载(?思考为什么要重载,哪些情况下常用)。在方法调用时,Java可以通过参数列表的不同来辨别应调用哪一个方法对象初始化和回收2.2.1 构造方法构造方法自定义构造方法自定义构造方法JAVA语言程序设计74l为为BankAccount声明一个有声明一个有三个参数三个参数的构的构造方法造方法public BankAccount(String initName, int initAccountNumber, float initBalance) owne

44、rName = initName; accountNumber = initAccountNumber; balance = initBalance; 对象初始化和回收2.2.1 构造方法构造方法例例2_13思考:形参若与成员变量重名怎么办?JAVA语言程序设计75l假设一个新帐号的初始余额可以为假设一个新帐号的初始余额可以为0,则可,则可增加一个带有两个参数的构造方法增加一个带有两个参数的构造方法public BankAccount(String initName, int initAccountNumber) ownerName = initName; accountNumber = in

45、itAccountNumber; balance = 0.0f; 2.2.1 构造方法构造方法例例2_13JAVA语言程序设计76l自定义无参的自定义无参的构造方法构造方法 无参的构造方法对其子类的声明很重要。如果在一个类中不存在无参的构造方法,则要求其子类声明时必须声明构造方法,否则在子类对象的初始化时会出错 在声明构造方法时,好的声明习惯是l不声明构造方法l如果声明,至少声明一个无参构造方法2.2.1 构造方法构造方法自定义无参构造方法自定义无参构造方法JAVA语言程序设计77l加强练习:加强练习:构建一个构建一个BushBush类,有两个有参数的构造类,有两个有参数的构造方法方法clas

46、s Bush Bush(int i) Bush(double d) 如果写,可否:new Bush(); 错误:编译器将要告诉你找不到对应的构造方法!l说明说明 用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法2.2.1 构造方法构造方法Bush.javaJAVA语言程序设计78l在例在例2_13基础上再声明一个无参的构基础上再声明一个无参的构造方法造方法public BankAccount() ownerName = ; accountNumber = 999999;

47、balance = 0.0f; 2.2.1 构造方法构造方法例例2_14JAVA语言程序设计79lthis关键字的使用关键字的使用 可以使用可以使用this关键字在一个构造方法中关键字在一个构造方法中调用另外的构造方法调用另外的构造方法 代码更简洁,维护起来也更容易代码更简洁,维护起来也更容易 通常用参数个数比较少的构造方法调用通常用参数个数比较少的构造方法调用参数个数最多的构造方法参数个数最多的构造方法2.2.1 构造方法构造方法this关键字的使用关键字的使用JAVA语言程序设计80l使用使用this关键字,修改关键字,修改BankAccout类中类中无参数和二参数的构造方法无参数和二参数

48、的构造方法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; accountNumber = initAccountNumber; balance = initBal

49、ance; 2.2.1 构造方法构造方法BankAccount.javaJAVA语言程序设计81l内存回收技术内存回收技术 当一个对象在程序中不再被使用时,就成为一个无用对象l当前的代码段不属于对象的作用域l把对象的引用赋值为空 Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存 Java运行时系统会在对对象进行自动垃圾回收前,自动调用对象的finalize()方法2.2.2 内存回收技术内存回收技术(简)(简)JAVA语言程序设计82l垃圾收集器垃圾收集器 自动扫描对象的动态内存区,对不再使用的对象做上标记以进行垃圾回收 作为一个线程运行l通常在系统空闲时异步地执行l当系统的内

50、存用尽或程序中调用System.gc()要求进行垃圾收集时,与系统同步运行2.2.2 内存回收技术内存回收技术垃圾收集器垃圾收集器对象初始化和回收JAVA语言程序设计83lfinalize()方法方法 在类java.lang.Object中声明,因此 Java中的每一个类都有该方法 用于释放系统资源,如关闭打开的文件或socket等 声明格式protected void finalize() throws throwable 如果一个类需要释放除内存以外的资源,则需在类中重写finalize()方法2.2.2 内存回收技术内存回收技术finalize()方法方法对象初始化和回收JAVA语言程序

51、设计84l同同C和和C+的区别的区别 C语言中通过free来释放内存 C+中则通过delete来释放内存 在C和C+中,如果程序员忘记释放内存,则容易造成内存泄漏甚至导致内存耗尽 在Java中不会发生内存泄漏情况,但对于其它资源,则有产生泄漏的可能性2.2.2 内存回收技术内存回收技术同同C和和C+的区别的区别对象初始化和回收JAVA语言程序设计85l对银行帐户类对银行帐户类BankAccount进行一系进行一系列修改和测试列修改和测试 声明BankAccount类 声明toString()方法 声明存取款方法 使用DecimalFormat类 声明类方法生成特殊的实例 声明类变量2.3 应用

52、举例应用举例JAVA语言程序设计86l包括状态、构造方法、包括状态、构造方法、get方法及方法及set方法方法public class BankAccountprivate String ownerName; private int accountNumber; private float balance; public BankAccount() this(, 0, 0); public BankAccount(String initName, int initAccNum, float initBal) ownerName = initName; accountNumber = initA

53、ccNum; balance = initBal; 应用举例2.3.1 声明声明BankAccount类类JAVA语言程序设计87 public String getOwnerName() return ownerName; public int getAccountNumber() return accountNumber; public float getBalance() return balance; public void setOwnerName(String newName) ownerName = newName; public void setAccountNumber(in

54、t newNum) accountNumber = newNum; public void setBalance(float newBalance) balance = newBalance; 应用举例2.3.1 声明声明BankAccount类类BankAccount.javaJAVA语言程序设计88l声明测试类声明测试类AccountTesterpublic class AccountTester public static void main(String args) BankAccount anAccount; anAccount = new BankAccount(ZhangLi,

55、100023,0); anAccount.setBalance(anAccount.getBalance() + 100); System.out.println(Here is the account: + anAccount); System.out.println(Account name: + anAccount.getOwnerName(); System.out.println(Account number: + anAccount.getAccountNumber(); System.out.println(Balance: $ + anAccount.getBalance();

56、 应用举例2.3.1 声明声明BankAccount类类AccountTester.javaJAVA语言程序设计89l测试结果测试结果Here is the account: BankAccount372a1aAccount name: ZhangLiAccount number: 100023Balance: $100.0应用举例2.3.1 声明声明BankAccount类类AccountTester测试结果测试结果JAVA语言程序设计90ltoString()方法方法 将对象的内容转换为字符串 Java的所有类都有一个默认的toString()方法,其方法体如下: getClass().g

57、etName() + + Integer.toHexString(hashCode()l下面的两行代码等价 System.out.println(anAccount); System.out.println(anAccount.toString(); 如果需要特殊的转换功能,则需要自己重写toString()方法应用举例2.3.2 声明声明toString()方法方法JAVA语言程序设计91ltoString()方法的几点说明方法的几点说明 必须被声明为public 返回类型为String 方法的名称必须为toString,且没有参数 在方法体中不要使用输出方法System.out.print

58、ln()2.3.2 声明声明toString()方法方法几点说明几点说明JAVA语言程序设计92l为为BankAccount类添加自己的类添加自己的toString()方法方法public String toString() return(Account # + accountNumber + with balance $ + balance); 应用举例2.3.2 声明声明toString()方法方法修改修改BankAccount类类JAVA语言程序设计93l对对BankAccount类进行重新编译并运行测类进行重新编译并运行测试类试类BankAccountTester,结果如下结果如下He

59、re is the account: Account #100023 with balance $100.0Account name: ZhangLiAccount number: 100023Balance: $100.0应用举例2.3.2 声明声明toString()方法方法测试结果测试结果JAVA语言程序设计94l给给BankAccount类增加存款及取款方法类增加存款及取款方法/存款 public float deposit(float anAmount) balance += anAmount; return(balance); / 取款 public float withdraw(

60、float anAmount) balance -= anAmount; return(anAmount); 应用举例2.3.3 声明存取款方法声明存取款方法JAVA语言程序设计95public class AccountTester public static void main(String args) BankAccount anAccount; anAccount = new BankAccount(ZhangLi, 100023,0); anAccount.setBalance(anAccount.getBalance() + 100); System.out.println(anA

温馨提示

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

最新文档

评论

0/150

提交评论