zhouLz-类与对象(110).ppt_第1页
zhouLz-类与对象(110).ppt_第2页
zhouLz-类与对象(110).ppt_第3页
zhouLz-类与对象(110).ppt_第4页
zhouLz-类与对象(110).ppt_第5页
已阅读5页,还剩133页未读 继续免费阅读

下载本文档

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

文档简介

1、1,第4章,类与对象,2,面向对象编程,3,相关概念,4,对象,对象是客观存在的具体实体,具有明确定义的状态和行为。,5,对象的示例,收银员对象,顾客对象,顾客 姓名:朱丽叶 年龄:28 体重:52千克 操作: 购买商品,状态,姓名:布兰尼 职衔:收银员 年龄:35 体重:60千克 操作: 收款 打印帐单,行为,6,类,类是用于组合各个对象所共有操作和属性的一种机制,形状类,动物类,汽车类,类的示例,“类是具有相同属性和行为的一组对象的集合”,7,类和对象的示例,收银员,系统管理员,仓库管理员,促销员,采购经理,8,属性,事物的特性,在类中表示为变量 每个对象的每个属性都拥有其特有的值 属性名

2、称由类的所有实例共享,住址,姓名,属性,年龄,“在类中表示对象或实体拥有的特性时称为属性 ”,9,方法,“对象执行的操作称为方法。”,10,方法的示例,缝衣服的步骤,量尺寸,得到工具,缝衣服,方法,缝制衣服,裁缝,11,类和对象的区别,类是概念模型, 定义对象的所 有特性和所需 的操作,对象是真实的模型,类定义实体,对象是实际的实体,12,面向对象的基本特征,13,封装性,信息隐藏,隐藏对象的实现细节,不让用户看到 将东西包装在一起,然后以新的完整形式呈现出来 例如,两种或多种化学药品组成一个胶囊 将方法和属性一起包装到一个单元中,单元以类的形式实现,“隐藏属性、方法或实现细节的过程称为封装。

3、”,14,封装的示例 3-1,接口,采购经理,罗杰斯先生,法拉力公司,.,迪斯尼汽车公司,.,市场经理,雪莉女士,要求,15,封装的示例 3-2,有选择地提供数据,法拉力公司,迪斯尼汽车公司,16,封装的示例 3-3,实体法拉力公司,实体迪斯尼汽车公司,Auti Ltd,.,Buto Ltd,.,17,继承性,父 类,子类,18,多态性,父类,子类 - 绘制和移动三角形,子类 - 绘制和移动矩形,子类 - 绘制和移动五边形,子类,19,4.1 类(P56),面向对象程序设计方法是指用面向对象的方法指导程序设计的整个过程。 所谓面向对象是指以对象为中心,分析、设计及构造应用程序的机制 特点:是将

4、分析问题的视角定位于现实世界中存在的实体。,20,在面向对象的程序设计中,将数据与对数据进行的操作合起来定义为类。 类是将数据和与数据相关的操作封装在一起的集合体,用来定义一组对象共同具有的状态(属性)和行为(方法)的模板。 类是一种复杂的数据类型,它不但包含数据,还包含了对数据进行操作的方法(Method),通常将类中的数据称为成员变量,而操作数据的方法称为成员方法,二者统称为类的成员。,21,4.1.1 类的定义(P56),在Java中,类是一种引用型数据类型。 类是对现实世界实体抽象的结果,其主要包含对实体属性及作用在这些属性上的行为能力的描述。 在编写程序时,首先需要对抽象的实体特征用

5、类加以描述,即进行类的定义。 类定义格式为: 修饰符 class 类名 extends 超类名 implements接口名列表 类体 ,22,修饰符: public(公共):public修饰的类能被所有的类访问。 abstract(抽象):abstract修饰的类不能被实例化,它包含 有未实现的方法。 final(最终):final修饰的类不能被继承,即不能有子类。 注意: abstract和final不能同时作为一个类的修饰符。 类名 类的名字不能是Java 中的关键字,要符合标识符规定,即名字可以由字母,下划线,数字或美圆符号组成,并且第一个字符不能是数字。但给类命名时,最好遵守如下习惯:

6、 如果类名使用拉丁字母,那么名字的首写字母使用大写字母,例如Hello、Time、People等。 类名最好见名知意,当类名由几个”单词”复合而成时,每个单词的首写字母使用大写,如BeijingTime、AmericanMap、HelloChina等。 extends(继承) extends保留字用来表明新创建的类继承哪个类,被继承的类称为此类的父类。extends后面只能跟一个父类名。 implements(实现): 用来表明这个类实现了哪些接口,接口名可以有多个。,23,类体,类体中定义了该类所有的成员变量和该类所支持的方法 其格式说明如下: 成员变量的声明 构造方法的声明与实现 成员方法

7、的声明及实现 说明: 1)类体的数据声明为成员变量,针对数据的操作声明为成员方法,数据的操作过程在成员方法的实现中体现。 2)构造方法主要用于类对象的实例化,又称构造器。 3)类体中声明的成员变量和方法的排列顺序可以任意。,24,例如: 矩形应该包含的属性有长、宽,应该具备的行为能力有设置长、宽的当前值,获取长、宽的当前值,计算矩形的面积与计算矩形的周长等。,25,/ file name:Rectangle.java public class Rectangle / 矩形类 private int length; / 表示长 private int width; / 表示宽 public vo

8、id setLength (int lengthValue) length = lengthValue; public void setWidth (int widthValue ) width = widthValue; public int getLength() return length; public int getWidth() return width; public int getArea() return length * width; public int getPerimeter () return 2 * ( length + width); ,26,UML始于1997

9、年,是一种面向对象建模的图形表示法。利用它可以从不同侧面描述所开发的软件系统的特征,为构造更加符合用户需求、更加可靠、更加安全、更加易于扩展的软件系统奠定了良好的基础。 “类图”是UML中用来描述类及类之间静态关系的图。,27,例:定义一个日期类Date public class Date / 日期类 private int year; / 表示年 private int month; / 表示月 priavte int day; / 表示日 public void setYear(int y) year = y; public void setMonth(int m) month = m;

10、public void setDay(int d) day = d; public void setDate(int y,int m,int d) year = y; month = m; day = d; public int getYear() return year; public int getMonth() return month; public int getDay() return day; ,28,例:定义一个学生类 public class Student / 学生类 private long No; / 表示学号 private String name; / 表示姓名 p

11、rivate char sex; / 表示性别 private Date birthday; / 表示出生日期 public void setNo(long n) No = n; public void setName(String n) name = n; public void setSex(char s) sex = s; public void setBirthday(Date b) birthday = b; public long getNo() return No; public String getName() return name; public char getSex()

12、 return sex; public Date getBirthday() return birthday; ,29,4.1.2 类中的成员变量(P57),每个对象的状态通过属性体现。 在程序中,对对象的操作主要是指更改对象属性的状态值和获取对象属性的当前状态值。 Java语言的成员变量有两种形式(P82) 一种是静态(static)的,被称为静态变量; 另一种是非静态的,被称为实例变量。,30,实例变量的显著特点:一个对象一个副本,即同一个类的不同对象有相同的属性项目,但各自拥有独立的副本,进而导致在同一时刻,不同对象可以拥有不同的状态值。 定义成员变量的格式为: 修饰符 static f

13、inal 数据类型 成员变量名1,成员变量名2, 说明: (1)修饰符的作用是限定成员变量的可访问权限,主要有public(公共的)、protected(受保护的)、private(私有的)以及缺省等四种情况 (2)static用于声明类成员变量,用于保存与整个类有关的状态数据的成员变量称为静态成员变量或者类成员变量,简称为类变量,final用于声明常量; (3)成员变量的数据类型既可以是基本数据类型,也可以是引用数据类型,如数组或者其他类对象等。,31,1成员变量的类型:成员变量和局部变量的类型可以是Java中的任何一种数据类型,包括基本类型:整型、浮点型、字符型;引用类型:数组、对象和接口

14、。P58 2成员变量的有效范围:成员变量在整个类内都有效,局部变量只在声明它的方法内有效。方法参数在整个方法内有效,方法内的局部变量从声明它的位置之后开始有效。P58 3实例变量与静态变量:在声明成员变量时,用关键字static给予修饰的称作静态变量,否则称作实例变量(类变量也称为static变量,静态变量)。P59,P82 4成员变量的隐藏:如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效。 P59 5编程风格 P59 (1)一行只声明一个变量。 (2)变量的名字符合标识符规定。 (3)变量名字见名知意,避免容易混淆的变量名字。,/变量的类型 p5

15、8,class People int boy; float a; void f() boolean cool; Workman zhangBoy; class Student double x; ,32,/变量的有效范围 p57 public class A void f() int m=10,sum=0; /成员变量,在整个类中有效 if(m9) int z=10; /仅在复合语句内有效 z=2*m+z; for(int i=0,im;i+) /i仅在循环内有效 sum=sum+i; m=sum; /合法 z=i+sum;/非法 ,33,/实例变量与类变量 p58 class float x

16、; static int y; ,34,/成员变量的隐藏 p58 class Tom int x=98,y; void f() int x=3; y=x; class 三角形 float sideA,sideB,sideC,lengthSum; void setSide(float sideA,float sideB,float sideC) this.sideA=sideA; this.sideB=sideB; this.sideC=sideC; ,35,36,5个初始化实例变量的途径: (1)Java为每种数据类型的实例变量提供了默认的初始值。 (2)如果希望将实例变量初始化为其他值,可以

17、在定义的同时赋予相应的初始值。 (3)在某个成员方法中,为实例变量赋值。 (4)在类的构造方法中实现初始化实例变量的操作,这是提倡使用的初始化方式。 (5)利用初始化块对成员变量进行初始化。,37,例:定义圆形类,并通过方法给实例变量赋值 public class Circle / 圆形类 private Point centre; / 表示圆心坐标 private float radius; / 表示圆的半径 / 初始化块 centre = new Point(50,50); radius = 10.0f; public void setCentre(Point p) centre = p;

18、 public void setRadius(float r) radius = r; public Point getCentre() return centre; public float getRadius() return radius; public float area( ) return radius * radius * 3.14159f; / 其他的成员方法 ; ,38,4.1.3 类中的成员方法,类中的成员方法主要承担对象的外部接口任务。 在类中,至少包含对类中的每个成员变量设置状态值,获取成员变量的当前状态值等一系列成员方法。 面向对象程序设计方法反复强调:在设计类时,应

19、该将描述对象属性的成员变量隐藏起来,用实现操作行为的成员方法作为对象之间相互操作的外部接口。因此,设计一套合理的成员方法,对于该类对象的可操作性至关重要。 成员方法是可被调用执行并返回值的、能实现特定功能的程序段。,39,1. 方法的定义(P60),方法的定义包括两部分:方法声明和方法体。 Java语言规定,方法的定义格式为: 成员方法声明格式如下: 修饰符abstractstaticfinal 返回值类型 方法名(参数列表) throws 异常类 方法体 说明: (1)方法的修饰符和成员变量的修饰符一样有四种情况; (2)abstract、static和final分别用于指定所声明的方法为抽

20、象方法、静态方法和最终方法。 (3)静态方法又称静态成员方法或类方法,一般用于与类有关的数据操作,可以使用类名直接调用。,40,(4)成员方法执行数据操作功能后都会向调用者返回数据操作的结果, 返回值类型就是用于声明该成员方法返回值结果的数据类型,可以是包括基本数据类型和引用类型在内任何合法的类型。 (5)若成员方法不返回任何值,则返回值类型用void标记,不能缺省。 (6)每个成员方法都有一个方法名,紧邻方法名的是用一对括号()括起来的参数列表,参数列表也称为形式参数表,简称形参表。 (7)形参表:主要用于声明该成员方法在被调用时需要调用者提供的、与数据操作相关的参数的个数与数据类型。 每个

21、成员方法允许声明的形参可以有0到多个,每个形参由形参数据类型、空格符和形参名组成,多个形参之间用逗号分隔,即便成员方法没有形参,括号()也不能缺省。,41,(8)形参的作用域是局部的,只限于声明它的成员方法之内有效。 throws用于声明该成员方法在执行过程中可能会抛出的异常类型。 (9)花括号所括起来的就是方法体,方法体可以包含一到多条语句,用以实现成员方法所负责的数据操作功能。 若成员方法的返回值类型不为void,则在方法体中需要使用return语句返回其数据操作的结果,且结果类型必须与方法声明的返回值类型相一致。 (10)在方法体内可以局部变量,其作用域只限于声明它的方法体内,且声明中不

22、能使用public等访问修饰符和static关键字,同时需遵循“先赋值,后使用”的原则,且在同一个类的不同方法中可以声明同名的局部变量,包括形式参数在内的所有局部变量都不能在方法体外被访问。,42,例: public class Time / 时间类 private int hour; / 表示小时 private int minute; / 表示分钟 private int second; / 表示秒 public void setTime(int h, int m, int s) hour = (h0) ? 0 : h % 24; minute=(m0)? 0: m % 60; secon

23、d=(s0)? 0: s % 60; public int getHour() return hour; public int getMinute() return minute; public int getSecond() return second; ,成员变量,成员方法,具有返回值的成员方法,/2.方法体 p60 int getSum(int n) int sum=0; for(int i=1;i=n;i+) sum=sum+i; return sum; ,43,几个注意的问题(P63),对成员变量的操作只能放在方法中,方法可以对成员变量和该方法体中声明的局部变量进行操作。 P63 实

24、例方法既能对类变量操作也能对实例变量操作,而类方法只能对类变量进行操作。P63 一个类中的方法可以互相调用,实例方法可以调用该类中的其它方法;类中的类方法只能调用该类的类方法,不能调用实例方法。P64,(1) p62 class A int a=12; float b=12.56f; class A int a; float b; a=12; b=12.56f; ,44,class A int a; float b; void f() int x,y; x=34; y=-23; a=12; b=12.56f; ,class A int a; static int b; void f(int x

25、,int y) a=x;/合法 b=y;/非法 static void g(int x) b=23;/合法 a=z; /非法 ,45,class A float a,b; void sum(float x,float y)/实例方法 a=max(x,y);/合法 b=min(x,y);/合法 system.out.print(a+b); static float getMaxSquare(float x,float y)/类方法 return max(x,y)*max(x,y);/合法 static float getMinSquare(float x,float y)/类方法 return

26、min(x,y)*min(x,y);/非法 static float max(float x,float y)/类方法 return ab?a:b; float min(float x,float y) /实例方法 return ab?a:b; ,46,47,实例方法和类方法的区别(P84),当用类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。 对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。,48,/4.2.7 类方法与实例方法 p62 class A int a; float max(float x,float y) /实例方法 .

27、static float jerry() /类方法 . static void speak(String s) /类方法 . ,49,2. 成员方法的重载(P61),所谓成员方法的重载是指在一个类中,同一个名称的成员方法被多次定义的现象。但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。 为了支持成员方法的重载,Java规定:具体调用哪个成员方法将由方法名与参数列表共同决定,且称此为成员方法的签名。 即在Java语言中,每个成员方法是由方法签名惟一标识的。因此,在同一个作用域中,不能够出现两个签名完全一样的成员方法,否则将产生编译错误。,50,例:方法重载 public

28、class Time / 时间类 private int hour; / 表示小时 private int minute; / 表示分钟 private int second; / 表示秒 public void setTime(int h, int m, int s) / 参数为3个int类型 hour = (h0) ? 0 : h % 24; minute = (m0)? 0: m % 60; second = (s0)? 0: s % 60; public void setTime(String time) / 参数为String类对象 hour = Integer.parseInt(t

29、ime.substring(0,1); hour = (hour 0) ? 0 : hour % 24; minute = Integer.parseInt(time.substring(3,4); minute = (minute 0) ? 0 : minute % 60; second = Integer.parseInt(time.substring(6,7); second = (second 0) ? 0 : second % 60; public int getHour() return hour; public int getMinute() return minute; pub

30、lic int getSecond() return second; ,重载方法setTime,调用时根据参数类型或个数来区分,习题4.10 P107,/4.2.5 方法重载 p60 class Area float getArea(float r) return 3.14f*r*r; double getArea(float x,int y) return x*y; float getArea(int x,float y) return x*y; double getArea(float x,float y,float z) return (x*x+y*y+z*z)*2.0; ,51,52,

31、3. 构造方法(P62),构造方法是在构造类对象时使用的成员方法,其主要作用是初始化成员变量。 构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,而且没有类型,构造方法也可以重载。 构造方法属于实例成员方法,它的主要作用是初始化实例变量,因此不需要返回任何值。 Java语言规定,构造方法不允许定义返回类型。,53,构造方法的声明格式如下: () 初始化的程序代码块 说明: (1)一个类的构造方法可以有多个,它们都具有相同的方法名,即类名; (2)与类的成员方法不同,构造方法用于创建类的实例(即对象)并对实例的成员变量进行初始化。 (3)构造方法没有返回值类型,且只能通过new运算

32、符调用,且其修饰符一般采用public,以便于在其他位置根据需要定义并实例化该类的对象。 (4)当一个类没有显式声明其构造方法时,Java编译器会自动为该类生成一个默认的、无参数的构造方法,且实例化后对象的成员变量在没有特别赋值的情况下自动获得其所声明类型的默认值。,54,例: public class Rectangle / 矩形类 private int length; / 表示长 private int width; / 表示宽 public Rectangle(int lengthValue, int widthValue) length = lengthValue; width =

33、widthValue; public void setLength (int lengthValue) length = lengthValue; public void setWidth (int widthValue ) width = widthValue; public int getLength() return length; public int getWidth() return width; public int getArea() return length * width; public int getPerimeter () return 2 * ( length +

34、width); ,构造方法,55,例:构造方法的重载,即有多个参数列表不同的构造方法。,public class Time / 时间类 private int hour; / 表示小时 private int minute; / 表示分钟 private int second; / 表示秒 public Time(int h, int m, int s) / 含有3个int参数 public Time(long time) / 含有一个long参数 public Time(String time) / 含有一个String类的参数 public void setTime(int h,int m

35、,int s) public int getHour() public int getMinute() public int getSecond() ,56,4. 类定义的基本原则,封装:将描述一个实体特征的所有内容封装在一起,包括表示实体属性的成员变量与表示实体行为能力的成员方法。 信息隐藏:将描述实体属性的成员变量设定为private访问特性,使其对外屏蔽起来,外界只能通过类提供的公共接口进行操作。 接口清晰:接口是外界与类对象沟通的渠道。接口设计既要清楚简洁又要符合人们的使用习惯。 通用性:可重用性是面向对象程序设计希望达到的主要目标之一,而通用性是保证可重用性的关键要素。 可扩展性:任

36、何事物都是不断发展的,软件产品也应该能够随着用户需求的变化而加以扩展,这是软件设计必须要考虑的问题。,57,通常,在一个类中,应该包含下列成员方法: (1)构造方法:至少应该包含一个不带参数的构造方法与一个带完整参数的构造方法。 (2)更改器(setX):保证在对象创建后更改对象的状态。 (3)获取器(getX):保证随时获得对象的状态值。 (4)toString:将对象的状态值转换为字符串。 (5)equals:实现判断两个对象是否相等的操作。,58,不同的类代表不同类别的实体特征,因此,类之间既有独立的一面,又有相互关联的一面。 可以将类之间的关系归结为3种:依赖、聚合与继承。 所谓依赖关

37、系是指“uses-a”关系,这是一种最明显、最常见的关系,当A类的成员方法调用B类的成员方法时,就说A类依赖B类。,5. 类之间的关系(P150),59,所谓聚合关系是指“has-a”关系,即类A的对象包含类b的对象。 例如:汽车类中应该包含发动机、轮胎、车体等类的对象。 所谓继承关系是指“is-a”关系,它主要反映“一般与特殊”的关系。 例如:大学生、中学生、小学生都属于学生,但是他们各自又拥有各自的特征。,60,类之间关系的图示,61,4.2 对象(P64),对象是用于模拟现实世界中实体的程序元素。 如果将要解决的问题称为问题空间,将解决问题的程序称为解空间,在问题空间中的实体就会被映射成

38、解空间中的对象。 从面向对象程序设计的观点看,对象是程序操作的基本单位。 所谓程序运行就是对象之间不断相互驱动、相互作用的过程。因此,在定义类后,需要将类进行实例化,即构造对象。 Java语言中,一个对象的生命周期经历:创建,使用,销毁等三个阶段。 对象被创建后将获得包括内存在内的所需资源;而对象销毁后,其所占的资源将被系统自动回收。 Java语言具有资源回收机制,能跟踪存储单元的使用情况,自动回收不再被使用的资源。,62,4.2.1 对象的创建 P65,创建对象时,一般先定义一个对象变量,再用new运算符实例化一个对象 Java规定,对象的定义、创建与初始化几个阶段,既可以分别实现,也可以合

39、并在一起实现。 创建一个对象包括对象的声明、为对象分配内在空间和赋初值3个步骤 1.对象声明格式 类名 对象名; /声明对象变量 例: Date dateObject;,63,2.为对象分配空间(P65) 使用new运算符和相应的构造方法为声明的对象分配内存,并实例化一个对象。 如果类中没有定义构造方法,系统为调用默认的构造方法。默认的构造方法是无参数的。 创建对象的语法格式为: 对象名=new 类名(实参列表 ); /实例化对象 例:dateObject=new Date();,64,其中,“类名”是对象所属的类名称,“参数列表”是创建对象时提供的参数,其格式取决于类定义时提供的构造方法的参

40、数列表。 例如, timeObject1= new Time(10,20,30); timeObject2 = new Time(08:25:15);,65,new运算符主要完成了下面两项工作: 为对象分配存储空间。 根据提供的参数格式调用与之匹配的构造方法,实现初始化成员变量的操作,然后返回本对象的引用。 Time timeObject3 = new Time(14:50:24); Time timeObject4 = new Time(09,20,45); new可以实例化类的多个不同的对象,分配不同的内存。因此,这些对象之间的状态相互独立。,class Point int x,y; Po

41、int(int a,int b) x=a; y=b; public class Example4_2 public static void main(String args) Point point1,point2; /声明对象point1和point2 point1=new Point(10,10); /为对象分配内存,使用 new 和类中的构造方法 point2=new Point(23,35); /为对象分配内存,使用 new 和类中的构造方法 ,66,例4.2 P65,67,4.2.2 对象成员的引用(P67),对象创建后,可以通过引用不同对象的成员变量,或调用不同对象的成员方法达到对

42、象间相互驱动的程序运行效果。 Java语言规定,引用对象的成员变量及调用对象的成员方法的语法格式为: 对象名.成员变量 对象名.成员方法(参数列表),68,对象方法的调用,说明: 对象名与成员变量或方法之间使用点运算符“.”分隔。 方法调用时给出的参数称为实际参数,简称实参。实参可以是常量、变量、表达式或方法的调用,实参的个数与数据类型及排列次序一定要与类定义中该方法声明的形参保持一致,且多个实参之间用逗号分隔。 当调用方法时,系统按照实参与形参一一对应的关系将实参的值或引用传递给对应的形参。 需要特别注意的是,若实参为引用类型的数据,其值不能为null。方法后的圆括号()是必需的,即便该方法

43、没有声明形式参数也不能缺省。,69,对象的引用和实体,当用类创建一个对象时,类中的成员变量在堆分配内存空间,这些内存空间称作该对象的实体或对象的变量,而对象中存放着引用。 一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体。,70,对象数组,Java语言中的数组属于引用数据类型,而数组元素既可以是基本数据类型,也可以是引用数据类型。 若数组元素为引用数据类型,如字符串、数组或类对象,则称该数组为对象数组。 对象数组是Java语言用于保存多个同类对象引用的主要手段,其定义格式与普通数组类似,只是用对象类名替代数据类型即可。 对象数组的初始化也需要使用new运算符获得数组元素的存储

44、空间,用于存放数组元素(对象)的引用,对于每一个数组元素还需要使用new运算符实现对象的实例化。,71,对象数组,例如: Dater dates =new Date3 /定义并初始化对象数组 Dates0=new C_Date(); /数组元素(对象)的实例化 Dates1=new C_Date(1949,10,1); Dates2=new C_Date(2009,11,20); 以上的操作所产生的对象数组的引用模型结构如图示。,72,例: 设计一个Java程序,其功能为:随机产生某个班级、某门课程的考试成绩,然后按照考试分数从高到低的顺序重新排列,并显示输出。 为了解决这个问题,需要设计两个

45、类。一个是考试成绩类ScoreClass;另一个是测试类TestScoreClass。,73,/ file name:ScoreClass.java public class ScoreClass private int No; / 学号 private int score; / 成绩 public ScoreClass() No = 1000; score = 0; public ScoreClass(int n, int s) No = n; score = s; public void setInfo(int n, int s) No = n; score = s; public int

46、 getNo() return No; /获取学号 public int getScore() return score; /获取成绩 public String toString() return No + t + score; public boolean equals(Object obj) / 覆盖Object中的成员方法 if (this = obj) return true; if (obj = null) return false; if (getClass() != obj.getClass() return false; ScoreClass other = (ScoreCl

47、ass) obj; if (other.No = No ,74,4.2.3 对象的清除,清除对象的主要任务是回收对象占用的所有资源,其中最主要的是空间资源。Java语言提供了“自动回收垃圾”的机制。 “自动回收垃圾”具体操作的过程是:在Java运行环境中,有一个用软件实现的“垃圾回收器”。当一个对象正在处于被引用状态时,Java运行系统会将其对应的存储空间做一个标记;当结束对象引用时,自动取消这个标记。 Java“垃圾回收器”周期性地扫描程序中所有对象的引用标记,没有标记的对象就被列入清除队列中。待系统空闲或需要存储空间时将其资源回收。,4.4方法的调用与参数传递(P70),方法调用的格式 在

48、方法中使用return提前返回 方法调用的过程分析,方法调用时给出的参数称为实际参数,简称实参。实参可以是常量、变量、表达式或方法的调用,实参的个数与数据类型及排列次序一定要与类定义中该方法声明的形参保持一致,且多个实参之间用逗号分隔。 当调用方法时,系统按照实参与形参一一对应的关系将实参的值或引用传递给对应的形参。,75,两种内存,堆内存和栈内存 int x; x = new int100; x=null; 的内存状态变化情况,76,java 中堆和栈的区别(P69),1. 栈的特点是 : 容量小 速度快 适合存放小型数据 如基本数据类型和对象类型的引用 在栈中变量直接指向存放变量值的空间,

49、 对于对象引用则存放对象在堆中的内存地址 2.堆的特点和栈相反 : 因此适合存放对象本身 3. 对象引用访问对象的原理是 : 先通过该引用找到栈中的数据,即对象的地址,再通过该地址访问对象,这就是为什么 对象 a=null; 调用a.方法(属性) 会引发异常 因为找不到实际对象的地址,77,返回,78,方法调用时的参数传值,当方法被调用时,如果方法有参数,参数必须要实例化,即参数变量必须有具体的值。 public class Date1 /类声明 int year,month,day; /成员变量,表示年、月、日 void setDate(int y,int m,int d) /成员方法,设置

50、日期值 /无返回值,有3个参数 year = y; month = m; day = d; public static void main(String args) Date1 aday = new Date1() ; /创建对象 aday.setDate(2006,1,28); /调用类的成员方法 ,79,1基本数据类型参数的传值(P70),基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别,比如,不可以向int类型参数传递一个float值,但可以向double类型参数传递一个float值。这种数据传递方式被称为是值传递,方法接收参数的值,但不能改变这些参数的值。 例4.4 P

51、71,方法的参数传递基本数据类型的参数传递,class PassValue public static void main(String args) int x = 5; change(x); System.out.println(x); public static void change(int x) x = 3; ,80,方法的参数传递基本数据类型的参数传递,81,82,2引用类型参数的传值(P71),引用传值方式:Java的引用类型数据包括对象、数组和接口,当方法中参数是引用类型时,引用数据类型传递给方法的是数据在内存中的地址,方法中对参数变量的操作可以改变原变量的值。,方法的参数传递引

52、用数据类型的参数传递,class PassRef int x ; public static void main(String args) PassRef obj = new PassRef(); obj.x = 5; change(obj); System.out.println(obj.x); public static void change(PassRef obj) obj.x=3; ,83,方法的参数传递引用数据类型的参数传递,84,方法的参数传递引用数据类型的参数传递,85,方法的参数传递引用数据类型的参数传递,86,方法的参数传递引用数据类型的参数传递,87,class Pass

53、Ref int x ; public static void main(String args) int x = new int1; x0 = 5; change(x); System.out.println(x0); public static void change(int x) x0=3; ,88,89,class People String face; void setFace(String s) face = s; class C void f(int x, double y, People p) x = x + 1; y = y + 1; p.setFace(笑脸); System

54、.out.println(参数x和y的值分别是: + x + , + y); System.out.println(参数对象p的face是: + p.face); public class Ep3_8 public static void main(String args) int m = 100; double n = 100.88; People zhang = new People(); zhang.setFace(很严肃的样子); C a = new C(); a.f(m, n, zhang); System.out.println(main方法中m和n的值仍然分别是: + m + ,

55、 + n); System.out.println(main方法中对象zhang的face是: + zhang.face); ,zhang.face= 很严肃的样子;,zhang.face= “笑脸;,参数x和y的值分别是:101,101.88 参数对象p的face是:笑脸 main方法中m和n的值仍然分别是:100,100.88 main方法中对象zhang的face是:笑脸,例4.5 P73,返回,90,this 关键字(P85),this是Java的一个关键字,表示某个对象。 this可以出现在实例方法和构造方法中,但不可以出现在类方法中。 this关键字出现在类的构造方法中时,代表使用

56、该构造方法所创建的对象。 实例方法必须通过对象来调用,当this关键字出现在类的实例方法中时,代表正在调用该方法的当前对象。 成员函数中定义了和成员变量中相同的变量时,引用成员变量要用this. 构造函数中调用同一个类的其他构造函数时用this。,91,【例】编写两个重载构造函数的类,在第二个构造函数中使用this调用第一个构造函数。,public class ThisConstructorCall public ThisConstructorCall(String s) System.out.println(s = + s); public ThisConstructorCall(int i

57、) this(i = + i); public static void main(String args) ThisConstructorCall t =new ThisConstructorCall(String call); ThisConstructorCall ct =new ThisConstructorCall(47); ,s = String call s = i = 47,例4.10 P85,92,this 关键字的示例,class Pixel int x; int y; void init (int x, int y) this.x = x; this.y = y; publ

58、ic static void main (String args) Pixel p = new Pixel(); p.init (4,3); ,习题4.8 P107,93,4.3 访问特性控制(P94),Java语言是通过访问特性控制符来实现隐藏数据,开放对外接口目的的。 在Java语言中,提供了4种访问特性控制符。它们分别是: 默认访问特性 public(公有)访问特性 private(私有)访问特性 protected(保护)访问特性。,94,在指定访问特性修饰符时需要注意: 如果没有指定任何访问特性修饰符,则为默认访问特性。 protected和private只能应用于内部类,不能应用于顶层类。有关内部类的相关内容将

温馨提示

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

评论

0/150

提交评论