类与对象.ppt

上传人:本田雅阁 文档编号:2600408 上传时间:2019-04-15 格式:PPT 页数:86 大小:498.51KB
返回 下载 相关 举报
类与对象.ppt_第1页
第1页 / 共86页
类与对象.ppt_第2页
第2页 / 共86页
类与对象.ppt_第3页
第3页 / 共86页
亲,该文档总共86页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《类与对象.ppt》由会员分享,可在线阅读,更多相关《类与对象.ppt(86页珍藏版)》请在三一文库上搜索。

1、第3章 类与对象,1,3.1 面向对象思想概述,程序面对的问题域客观世界 客观世界有很多事物 事物有自己的状态和行为 事物间有各种联系 通过事物间的联系,事物产生相互作用 在一个面向对象系统 对象是现实世界的事物的抽象 事物的状态抽象为对象的属性和方法 事物间的关系通过对象间的关系表示 事物间的相互作用通过对象间的消息通信支持。,2,3.1.1 对象,客观世界由具体事物构成,每个事物由自己的一组状态和行为。 把问题域中的事物抽象为对象,状态抽象为一组数据(属性),行为抽象为一组操作服务(方法) 对象: 对象标识:对象名 属性:一组数据(数据成员) 方法:操作,服务(成员方法),一辆汽车 静态特

2、征: 颜色:蓝色 型号:XXXX 马力:100 动态特征: 行驶 转弯 停车,car1 属性:“blue”,”XXXX“,100 方法:move,turn,stop,3,3.1.2 类,把具有共同性质的事物归为一类,得出一个抽象的概念(抽象与分类原则) 对象是对事物的抽象 类是对对象的抽象 面向对象语言中 类是对同类的所有对象的抽象描述 属性描述 方法描述 类 类标识:类名 属性说明(属性名,属性类型) 方法说明与实现,对象:car1 属性:“blue”,”XXXX“,3 方法:move,turn,stop,对象:car2 属性:“red”,”YYYY“,2.5 方法:move,turn,st

3、op,类:Car 属性说明: color 字符串, type 字符串, horsePower 整数 方法说明与实现:move,turn,stop,4,类与对象的关系,抽象与具体的关系 类是同类对象的抽象描述 对象是符合类描述的具体事物 我们称:对象是类的实例 程序 先定义类 创建类的对象,完成系统功能,模具-零件 类型-变量,5,3.1.3 消息通信,把对象之间产生相互作用所传递的信息称做消息。 通过给对象发送消息请求对象提供服务,实现对象间的协作,完成相应的功能。 消息格式: 接收消息的对象,请求的功能,传递的数据 返回的结果,car2.move,其他对象或全局函数,对象:car2 属性:“

4、red”,”YYYY“,2.5 方法:move,turn,stop,消息,对象的方法就是对象能提供的功能(服务),给对象发消息就是调用对象的方法。,6,3.1.4 对象之间的关系,事物之间的关系体现为对象之间的关系 对象之间有关系,才能进行消息通信 对象间关系的表示,7,3.2 类,Java程序设计过程就是定义类的过程 定义类 定义类的对象及之间交互 Java的类 系统定义的类(通用的类:输入输出,界面等) 自定义的类(特定应用相关的类),8,【例3-1】矩形形状类 class Rectangle int width; int height; void area() int a=width*h

5、eight; System.out.println(“面积为“+a); void perimeter() int a=2*(width+height); System.out.println(“周长为“+a); ,9,3.2.1 类定义,修饰符 class 类名 extends 父类名 implements 接口名列表 数据成员声明 成员方法声明与实现 ,类头 必须项:class 类名 可选项 extends 父类名 implements 接口名列表 类的修饰符:public abstract | final 类体,10,3.2.2 数据成员定义,数据成员要在类体中声明 修饰符 数据类型 变量

6、名; 必须项:数据类型 变量名; 可选项: 数据成员修饰符:public | protected | private static final transient volatile,11,3.2.3 成员方法的定义,修饰符 返回类型 方法名(形参列表) 抛出异常列表 语句序列 ,12,1、方法头,必须项:返回类型 方法名() 方法名() 返回类型:方法返回结果的类型。若不需要返回值,则为void 可选项: 形参列表: 类型名 形参名1,类型名2 形成名2 . 抛出异常列表 方法的修饰符:public | protected | private static final|abstract nat

7、ivesynchronized,13,2、方法体,语句 使用参数 返回值与return语句 return 表达式; 结束方法执行,将表达式的值作为方法的返回结果。(适于返回类型为非void) return; 结束方法执行。(适于返回类型为void),void drawRect(char c) int side=5; for(int i=0;iside;i+) for(int j=0;jside;j+) System.out.print(c); System.out.println(); ,14,int f ( int x ) if(x0) return x; ,int f ( int x )

8、if(x0) return true; else return false; ,return语句会结束方法执行 所有控制路径都应有返回值 返回值的类型应与方法头声明的返回类型兼容(相同,或能自动转换),15,3、成员方法对数据成员的访问,类的成员方法可以自由使用类的数据成员,class Rectangle int width; int height; void area() int a=width*height; System.out.println(“面积为“+a); void perimeter() int a=2*(width+height); System.out.println(“周

9、长为“+a); ,16,4、类的成员方法对成员方法的调用,类的成员方法可以自由调用自己类的方法。 方法名(实参列表) 方法调用可以作为独立语句。若有返回值,可用返回值继续参与其他运算。,class Rectangle int width; int height; void area() int a=width*height; System.out.println(“面积为“+a); void perimeter() int a=2*(width+height); System.out.println(“周长为“+a); void computeAndDisplay() area(); peri

10、meter(); ,17,5、改善【例3-1】,class Rectangle int width; int height; int area() int a=width*height; return a; int perimeter() int a=2*(width+height); return a; void display() System.out.println(“矩形宽为“+width+“,高为“+height); void computeAndDisplay () int a = area(); int p = perimeter(); System.out.println(“面

11、积为“+a+“,周长为“+p); ,18,void set( int w, int h) width=w; /用形参w的值设置数据成员width的值 height=h; /用形成h的值设置数据成员height的值 void scale( int s ) width=width*s; height=height*s; ,19,3.3 对象,类不是运行时存在的事物。 通过类创建其对象。对象是运行时存在的具体事物。,类:数据类型 对象:变量,20,3.3.1 创建对象,对象的创建分两步,对象声明 类名 对象名; 对象创建 对象名= new 类名( 实参列表 ) ;,注:也可以合成一步 类名 对象名=

12、 new 类名(实参列表 );,Rectangle r; r = new Rectangle(); Rectangle r1 = new Rectangle(); Rectangle r1,r2; Rectangle r1=new Rectangle(), r2=new Rectangle();,21,对象创建的分析引用类型,对象的创建分两步: 1、对象的声明: 类型 变量名; 但对象声明并不会真正创建对象, (不会给对象分配内存) 只是创建一个引用(它的值用来指向对象) 2、对象创建: 运算符new创建对象(为对象分配内存空间) new运算符创建对象,并返回对象的引用,将这个引用赋值给同类型

13、的引用变量,那么通过该引用变量可以找到创建的对象,Rectangle r1; r1=new Rectangle();,22,3.3.2 使用对象,对象是拥有数据成员和成员方法的实体。故对象的使用: 访问对象的数据成员 调用对象的成员方法 1、访问数据成员 对象名.数据成员名,Rectangle r = new Rectangle(); r.width=5; r.height=10; Rectangle r1 = new Rectangle(); r1.width=2; r1.height=3;,23,2、调用成员方法 对象名. 成员方法名(实参列表) 参数传递 实参与形参一一对应,类型匹配 方

14、法的返回值 方法调用表达式:可以独立为语句,或基于返回值继续参与表达式等 方法调用的执行过程,class Rectangle void set(int w, int h) width=w; height=h; int area() return width*height; ,Rectangle r = new Rectangle(); r.set(5, 10);,int d; d= r.area();,24,3、让程序运行起来 创建对象,执行功能 消息通信 避免直接访问数据成员 定义主类 创建一个包含main方法的类 在main方法中创建对象,完成功能,class A public class

15、 Test public static void main(String args) A a=new A(); ,25,class Rectangle int width; int height; void set(int w, int h) width=w; height=h; int area() int a=width*height; return a; int perimeter() int a=2*width*height; return a; void display() System.out.println(“矩形宽为“+width+“,高为“+height); void com

16、puteAndDisplay () int a = area(); int p = perimeter(); System.out.println(“面积为“+a+“,周长为“+p); ,26,public class Test /主类 public static void main(String args) Rectangle r=new Rectangle(); r.set(25, 36); r.display(); puteAndDisplay(); System.out.println(“-“); Rectangle r1=new Rectangle(); r1.set(18, 47)

17、; r1.display(); puteAndDisplay(); System.out.println(“-“); System.out.println(“前面两个矩形中,面积较大的矩形为:“); if(r.area()r1.area() r.display(); else r1.display(); ,27,编译: 两个类在一个文件里:Test.java(以public类的类名命名) 一个文件最多一个public类(这里把主类设为public类) javac Test.java 两个类各在一个文件里:Test.java,Rectangle.java javac Rectangle.java

18、 javac Test.java 运行 java Test; (Test 是main函数所在类),编译完成后,每个类生成一个字节码文件 Test.class Rectangle.class,28,3.4 方法重载,一个类中,多个方法使用同一个名字,称为方法的重载。 方法重载的区分 参数个数不同,或参数类型不同,这样的重载是有效的方法重载。 注意:方法名的不同,或返回值类型的不同是不能区分重载方法的。,class A void f(int a, int b) void f(int a,int b,int c) void f(double a, double b) ,A a=new A(); a.

19、f(1,1); a.f(1,2,3); a.f(1.234,0.67);,29,class Rectangle void scale(int s) width=width*s; height=height*s; void scale ( int s, char type) if ( type = = w) width = width*s; else if ( type = = h) heigh = height*s; ,30,3.5 对象的初始化与清除,初始化:变量(对象)在使用前应该具有确定的值。 清除:当变量或对象用完,其内存应回收 局部变量 初始化:方法体内定义的局部变量在使用前必须已经

20、赋值,否则编译错误。 清除:方法体内局部变量在方法结束时由系统清除。 对象 初始化: 清除:,31,3.5.1 构造方法,构造方法与类同名,且没有返回值。形如: 类名(形参列表) /语句 有关构造方法的几条规则: 对象创建时一定会调用构造方法。构造方法也只能在创建对象时,由Java系统自动调用,以后不能再主动调用。 对象创建时必须与构造方法格式一致,即构造方法若有形参列表,则创建对象时应传递匹配的实参列表。 若类没有定义构造方法也是可以的,Java系统会自动为类创建一个不带参数的构造方法,当然这个方法的方法体是空的,什么初始化操作也不做。,32,构造方法的重载,一个类可以有多个构造方法,创建对

21、象时,要与其中一种构造方法匹配。 一旦已经定义了构造方法,Java系统就不会再自动创建不带参数的构造方法了(即使类中定义的构造方法中并没有不带参数的构造方法)。 不带参数的构造方法(简称无参构造方法,也常称为默认构造方法,缺省构造方法)是很重要的构造方法,很多情况下会自动调用它。,33,class Rectangle int width; int height; Rectangle() /构造方法(1),不带参数 width=1; height=1; Rectangle(int w,int h) /构造方法(2),带两个参数 width=w; height=h; void display()

22、System.out.println(“矩形宽为“+width+“,高为“+height); public class Test public static void main(String args) Rectangle r=new Rectangle(); Rectangle r1=new Rectangle(3,5) r.display(); r1.display(); ,34,3.5.2 对象的初始化,所有的数据在使用前都应有值 对象属性在使用前应有值(如:访问对象属性,调用对象成员方法) 对象初始化的三种方法 数据成员默认值 在说明数据成员时直接初始化 使用构造方法,35,1、默认值

23、初始化 在对象创建时,其数据成员会自动被初始化为默认值,class A int x; void display() System.out.println(x); public class Test public static void main(String args) A a=new A(); a.display(); int x; System.out.println(x); ,注:方法内创建的局部变量不会自动初始化,36,2、在说明类的数据成员时直接初始化,class A int a=10; Rectangle r = new Rectangle(3,5); void f() ,3、使用

24、构造方法初始化 4、初始化的执行 先默认值初始化 再根据声明时赋值情况,设置数据成员的值 最后调用构造方法,class A int x; int y=10; int z; Rectangle r; A() x=100; r=new Rectangle(); ,37,3.5.3 对象的清除,Java中的对象必须通过new关键字创建 而Java运行时系统提供了垃圾收集机制,能监测所有用new创建的对象的使用状态,当对象不再需要的时候会自动清除它们,收回内存。,38,3.6 this引用,在类的方法中(不包含静态方法)都隐含了一个this引用,这个引用的类型为当前类,其指向的是调用方法的当前对象。

25、this的使用方法与普通引用的使用是相同的。在类的方法中可以自由使用这个引用来访问当前对象的数据成员,或针对当前对象来调用方法。,. int area() int a=this.width* this.height; return a; .,Rectangle r=new Rectangle(2,3); int d = r.area(); /隐含效果Rectangle.area( r );,39,this的使用,返回当前对象自己 区分同名数据成员与形参 在构造方法中使用构造方法,class A int x; void f(int x) this.x=x; ,class Rectangle in

26、t width; int height; Rectangle(int w,int h) width=w; width=h; Rectangle() this(1,1); /调用第一个构造方法 ,40,3.7 引用类型理解与应用,基本类型:变量声明的同时创建了特定类型的数据(进行了内存分配) 引用类型:所有其他类型都为引用类型(类,数组,接口),其特点为:进行变量声明的时候只创建引用变量,而不创建具体对象。具体对象需要用new创建(分配内存) 引用与对象分离,其对应关系不固定,可以变化。这样就有可能产生一些前面讲基本类型时没有遇到过的问题: (1)一个引用先后指向不同的对象的情况。 (2)多个引

27、用指向同一个对象的情况。,41,3.7.1 理解引用类型,引用支持的运算 赋值 =,!= 1、赋值运算 (1)被new创建的对象赋值。(表示:引用指向了一个对象) (2)被同类型的引用变量赋值。(注意:这会引起两个引用指向同一个对象) (3)被赋值以null。(表示引用不再指向任何对象),42,class Rectangle int width; int height; Rectangle(int width,int height) this.width=width; this.height=height; void set(int width,int height) this.width=w

28、idth; this.height=height; void display( ) System.out.println(“矩形宽为“+width+“,高为“+height); public class Test public static void main(String args) ,43,Rectangle a=new Rectangle(1,2); Rectangle b=new Rectangle(3,4); a = b; a.display(); b.display(); a.set(5,6); a.display(); b.display(); a=null; b=null; a

29、.display();/错误,一个对象如没有任何引用指向它,对象就是无用的,无用的内存由Java垃圾收集机制回收。,当对象使用完毕时,可以将引用变量赋值为null,44,2、比较运算中的=,!= 两个引用变量可以进行相等与不等的比较,其比较的是引用的值,而不是引用所指向的对象是否相等 引用变量可以与null进行相等与不等的比较,来判断引用变量是否指向了对象,Rectangle a = new Rectangle(3,4); Rectangle b = new Rectangle(3,4); if(a=b) System.out.println(“相等1”); a=b; if(a=b) Syst

30、em.out.println(“相等2”); a=null; a.display();/错误 if (a!=null) a.display();,45,3.7.2 方法参数传递,参数传递方式 按值传递:Java的基本类型数据采用这种传递方式。其特点是,实参将其值传递给形参,形参是实参的一个本地拷贝,对形参的操作对实参没有影响。 按引用传递:Java的引用类型的对象都采用这种传递方式。其特点是:参数传递时,实际传递的是对象的引用,而不是对象本身。形参是“实参引用”的一个本地拷贝,这样形参会指向实参对象,通过形参引用对对象的操作会作用到实际的实参对象上。,46,【例3-4】按值传递对实参的影响 c

31、lass A void parameterChangeTest ( int n) n = 10; public class Test public static void main(String args) A a = new A(); int b=13; a. parameterChangeTest ( b); System.out.println (b); ,形参n与实参b没有直接联系,对n的改变对b没影响,47,【例3-5】按引用传递对实参的影响 class A void parameterChangeTest ( B n) n.i = 10; class B int i; public

32、 class Test public static void main(String args) A a = new A(); B b = new B(); b.i=100; a. parameterChangeTest ( b); System.out.println (b.i); ,形参n即代表实参对象b,通过n改变数据成员,就是改变实参对象,48,【例3-6】按引用传递对实参的影响 class A void parameterChangeTest ( B n) n = new B(); n.i = 10; class B int i; public class Test public s

33、tatic void main(String args) A a = new A(); B b = new B(); b.i=100; a. parameterChangeTest ( b); System.out.println (b.i); ,对形参引用的重新赋值对实参并没有影响。,49,引用类型做参数应用,class Rectangle int width; int height; Rectangle()width=0;height=0; Rectangle(int w,int h)width=w; height=h; Rectangle(Rectangle r) width=r.wid

34、th; height=r.height; void set(int width,int height) this.width=width; this.height=height; void set(Rectangle r) width=r.width; height=r.height; ,50,boolean equals(Rectangle r) return (width=r.width) ,51,3.7.3 返回值为引用类型,方法的返回值也可以为引用类型。 当需要返回对象时,返回的实际是对象的引用,而不是对象本身。当将这个返回的引用赋值给某个声明的引用变量时,这个引用变量会指向这个返回值

35、(引用)指向的对象。,52,【例3-8】引用类型做返回值(返回当前对象) class Rectangle int width; int height; Rectangle(int w,int h)width=w; height=h; void set(int width,int height) this.width=width; this.height=height; void display() System.out.println(“矩形宽为“+width+“,高为“+height); Rectangle scale(int s) width=width*s; height=height*

36、s; return this; ,53,Rectangle scale(int s,char type) if(type=w) width=width*s; else if(type=h) height=height*s; return this; public class Test public static void main(String args) Rectangle a=new Rectangle(3,5); a.display(); Rectangle b=a.scale(3); b.display(); b.set(1,1); /语句(a) a.display(); /语句(b)

37、 b.display(); /语句(c) ,54,【例3-9】引用类型做返回值(返回新对象) class Rectangle int width; int height; Rectangle(int w,int h)width=w; height=h; void display() System.out.println(“矩形宽为“+width+“,高为“+height); Rectangle scale(int s) Rectangle r=new Rectangle(width*s,height*s); return r; Rectangle scale(int s,char type)

38、Rectangle r; if(type=w) r=new Rectangle(width*s,height); else if(type=h) r=new Rectangle(width,height*s); else r=new Rectangle(width,height); return r; ,55,public class Test public static void main(String args) Rectangle a=new Rectangle(3,5); a.display(); Rectangle b=a.scale(3); b.display(); a.displ

39、ay(); ,56,3.7.4 类的数据成员为引用类型,一个类的数据成员可以为基本类型,也可以为引用类型(如类的数据成员类型可以为已定义的其它类)。 这使我们不必从头定义一个类,而是可以使用已定义的其他类来描述类的数据成员,使类的定义更加方便。,57,class Rectangle /此类与前面定义相同,这里省略 class WallPaint Rectangle wall; double unitPrice; WallPaint() wall=new Rectangle(0,0); unitPrice=0; WallPaint(int w, int h, double p) wall = n

40、ew Rectangle(w,h); unitPrice=p; void setUnitPrice(double p) unitPrice=p; void changeWall(int w, int h) wall.set(w,h); /修改矩形对象 ,58,double computePay() return unitPrice* wall.area(); void display() System.out.print(“墙体彩绘业务:n墙体“); wall.display(); System.out.println(“此笔业务单价“+unitPrice); public class Tes

41、t public static void main(String args) WallPaint w=new WallPaint(2,3,125); w.display(); System.out.println(“总价格为:“+putePay() ); ,59,3.8 作用域与生存期,作用域:标识符的使用范围 生存期:运行时,标识符的存在区间,60,3.8.1 作用域,局部域:方法体内定义的标识符(补充2.6) (1)方法的形参作用域为整个方法,其在方法调用时通过参数传递初始化。 (2)异常处理参数作用域为其后跟的表示的语句块,其在异常参数传递时初始化。 类域:在类体中(方法外)定义的标识符

42、为类的数据成员和成员方法,其作用域为类域。 (1)类的数据成员和成员方法标识符的作用域以类为单位,在整个类内有效(允许类的所有成员方法直接访问)。 (2)类的数据成员互相不能同名,类的成员方法也互相不能同名(因为在同一作用域)。 (3)成员方法的局部变量可以与类的数据成员同名,但该类的数据成员在方法体内被暂时屏蔽。但可以通过this引用来访问该类的被屏蔽的数据成员。,61,【例3-12】局部引用变量与对象 class A int i; A(int i1)i=i1; void display()System.out.println(i); public class Test public sta

43、tic void main(String args) A a; A b=new A(10); b.display(); a=b; a.display(); ,62,3.8.2 生命期,1、局部变量生命期 局部变量的生命期与其作用域有关。 其在程序执行流程中,当到达作用域时变量开始使用,生命期开始,超出作用域则不再使用,生命期结束。 内存栈区 2、数据成员生命期与对象生命期 数据成员生命期:数据成员随对象创建而分配内存,随对象销毁而销毁,其生命期与对象生命期一致。 对象生命期:new创建时生命期开始,没有引用指向时生命期结束。 内存堆区:垃圾收集机制,63,class Rectangle /内容

44、略 class A Rectangle r; void set(Rectangle re)r = re; public class Test public static void main(String args) Rectangle r1 = new Rectangle(1,1); A b = new A(); b.set(r1); A c = new A(); c.set(r1); ,64,3.9 静态数据成员与静态方法,实例数据成员,实例方法 类数据成员,类方法(静态数据成员,静态方法),65,3.9.1 静态数据成员,类的静态数据成员概念 数据成员属于类,而不属于任何特定的对象,由类的

45、所有对象共享。,类:Student 属性: 学号,姓名,成绩 学生数 方法:显示学生信息,对象:aaa “001”,“aaa”,89,对象:bbb “002”,“bbb”,78,66,1、类的静态数据成员声明 用static修饰符修饰类的数据成员 2、类的静态数据成员访问 类静态数据成员可通过类名直接访问,也可以通过对象访问,在类的方法中直接访问。 注意:类的静态数据成员值被所有对象共享,任何对象都可以访问类的静态数据成员,但要注意,它们使用的是同一个数据,操作的是同一块内存。无论哪个对象修改了它,对其它对象来说,它也已经变了。,67,【例3-14】类的静态数据成员访问 class A sta

46、tic int i ; void change(int i1) i=i1; public class Test public static void main(String args) A.i=10; A a=new A(); A b=new A(); System.out.println(A.i+“,“+a.i+“,“+b.i); a.change(40); System.out.println(A.i+“,“+a.i+“,“+b.i); b.i+=10; System.out.println(A.i+“,“+a.i+“,“+b.i); ,68,3、静态数据成员的初始化 默认初始值,声明时直

47、接初始化,静态初始化器。 静态初始化器:Java允许通过静态初始化器初始化静态数据成员。静态初始化器语法:,class A static int i; static int j=10; static int k; static int m; static k=20; m=30; ,static ./静态数据成员初始化语句 ,69,4、实例数据成员与静态数据成员的对比 类静态数据成员与实例数据成员二者区别: (1)不管有多少类的实例,类的静态数据成员只有一份拷贝,即所有对象共享相同的静态数据成员;而每个实例对象都有自己的实例数据成员。 (2)类的静态数据成员仅在类初次使用时创建、初始化以后不会再初始化了。而每当创建类的对象时都为实例数据成员分配存储空间,并初始化。 (3)实例数据成员只能通过对象来访,而类静态数据成员既可以通过类名来访问,也可以通过对象来访问。,70,【例3-15】实例数据成员与静态数据成员的对比 class A static int i; int j; A()i=10; j=10; void add()i+; j+; void display() System.out.println(“i=“+i+“,j=“+j);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1