类与对象-精选课件_第1页
类与对象-精选课件_第2页
类与对象-精选课件_第3页
类与对象-精选课件_第4页
类与对象-精选课件_第5页
已阅读5页,还剩167页未读 继续免费阅读

下载本文档

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

文档简介

第3章类与对象1第3章类与对象113.1面向对象思想概述程序面对的问题域—客观世界客观世界有很多事物事物有自己的状态和行为事物间有各种联系通过事物间的联系,事物产生相互作用在一个面向对象系统对象是现实世界的事物的抽象事物的状态抽象为对象的属性和方法事物间的关系通过对象间的关系表示事物间的相互作用通过对象间的消息通信支持。23.1面向对象思想概述程序面对的问题域—客观世界223.1.1对象客观世界由具体事物构成,每个事物由自己的一组状态和行为。把问题域中的事物抽象为对象,状态抽象为一组数据(属性),行为抽象为一组操作服务(方法)对象:对象标识:对象名属性:一组数据(数据成员)方法:操作,服务(成员方法)一辆汽车静态特征:颜色:蓝色型号:XXXX马力:100动态特征:行驶转弯停车car1属性:“blue”,”XXXX“,100方法:move,turn,stop33.1.1对象客观世界由具体事物构成,每个事物由自己的一组33.1.2类把具有共同性质的事物归为一类,得出一个抽象的概念(抽象与分类原则)对象是对事物的抽象类是对对象的抽象面向对象语言中类是对同类的所有对象的抽象描述属性描述方法描述类类标识:类名属性说明(属性名,属性类型)方法说明与实现对象:car1属性:“blue”,”XXXX“,3方法:move,turn,stop对象:car2属性:“red”,”YYYY“,2.5方法:move,turn,stop类:Car属性说明:color字符串,type字符串,horsePower整数方法说明与实现:move,turn,stop43.1.2类把具有共同性质的事物归为一类,得出一个抽象的概4类与对象的关系抽象与具体的关系类是同类对象的抽象描述对象是符合类描述的具体事物我们称:对象是类的实例程序先定义类创建类的对象,完成系统功能模具----零件类型-----变量5类与对象的关系抽象与具体的关系模具----零件553.1.3消息通信把对象之间产生相互作用所传递的信息称做消息。通过给对象发送消息请求对象提供服务,实现对象间的协作,完成相应的功能。消息格式:接收消息的对象,请求的功能,传递的数据返回的结果car2.move其他对象或全局函数对象:car2属性:“red”,”YYYY“,2.5方法:move,turn,stop消息对象的方法就是对象能提供的功能(服务),给对象发消息就是调用对象的方法。63.1.3消息通信把对象之间产生相互作用所传递的信息称做消63.1.4对象之间的关系事物之间的关系体现为对象之间的关系对象之间有关系,才能进行消息通信对象间关系的表示73.1.4对象之间的关系事物之间的关系体现为对象之间的关系73.2类Java程序设计过程就是定义类的过程定义类定义类的对象及之间交互Java的类系统定义的类(通用的类:输入输出,界面等)自定义的类(特定应用相关的类)83.2类Java程序设计过程就是定义类的过程88【例3-1】矩形形状类classRectangle{ intwidth; intheight; voidarea(){ inta=width*height; System.out.println("面积为"+a); } voidperimeter(){ inta=2*(width+height); System.out.println("周长为"+a); }}9【例3-1】矩形形状类993.2.1类定义[修饰符]class类名[extends父类名][implements接口名列表]{

数据成员声明 成员方法声明与实现}类头必须项:class类名可选项[extends父类名][implements接口名列表]类的修饰符:[public][abstract|final]类体103.2.1类定义[修饰符]class类名[ext103.2.2数据成员定义数据成员要在类体中声明

[修饰符]数据类型变量名;必须项:数据类型变量名;可选项:数据成员修饰符:[public|protected|private][static][final][transient][volatile]113.2.2数据成员定义数据成员要在类体中声明11113.2.3成员方法的定义[修饰符]返回类型方法名([形参列表])[抛出异常列表]{

语句序列}123.2.3成员方法的定义[修饰符]返回类型方法名([形121、方法头必须项:返回类型方法名()方法名()返回类型:方法返回结果的类型。若不需要返回值,则为void可选项:形参列表:

类型名形参名1,类型名2形成名2...[抛出异常列表]方法的修饰符:[public|protected|private] [static][final|abstract][native][synchronized]131、方法头必须项:返回类型方法名()13132、方法体语句使用参数返回值与return语句

return表达式; 结束方法执行,将表达式的值作为方法的返回结果。(适于返回类型为非void)

return; 结束方法执行。(适于返回类型为void)voiddrawRect(charc){ intside=5;

for(inti=0;i<side;i++){

for(intj=0;j<side;j++)

System.out.print(c); System.out.println(); }}142、方法体语句voiddrawRect(charc){14if(x<0)returnx;elsereturn-xif(x<0)returnx;return–x;intf(intx){ if(x<0) returnx;}intf(intx){ if(x<0) returntrue; else returnfalse;}return语句会结束方法执行所有控制路径都应有返回值返回值的类型应与方法头声明的返回类型兼容(相同,或能自动转换)15if(x<0)if(x<0)intf(intx153、成员方法对数据成员的访问类的成员方法可以自由使用类的数据成员classRectangle{

intwidth; intheight; voidarea(){ inta=width*height; System.out.println("面积为"+a); } voidperimeter(){ inta=2*(width+height); System.out.println("周长为"+a); }}163、成员方法对数据成员的访问类的成员方法可以自由使用类的数据164、类的成员方法对成员方法的调用类的成员方法可以自由调用自己类的方法。

方法名([实参列表])

方法调用可以作为独立语句。若有返回值,可用返回值继续参与其他运算。classRectangle{ intwidth; intheight; voidarea(){ inta=width*height; System.out.println("面积为"+a); } voidperimeter(){ inta=2*(width+height); System.out.println("周长为"+a); } voidcomputeAndDisplay() { area(); perimeter(); }}174、类的成员方法对成员方法的调用类的成员方法可以自由调用自己175、改善【例3-1】classRectangle{ intwidth; intheight; intarea(){ inta=width*height;

returna; } intperimeter(){ inta=2*(width+height);

returna; } voiddisplay(){ System.out.println("矩形宽为"+width+",高为"+height); } voidcomputeAndDisplay(){ inta=area(); intp=perimeter(); System.out.println("面积为"+a+",周长为"+p); }185、改善【例3-1】classRectangle{1818 voidset(intw,inth){ width=w;//用形参w的值设置数据成员width的值

height=h;//用形成h的值设置数据成员height的值

} voidscale(ints){ width=width*s; height=height*s; }}19 voidset(intw,inth){19193.3对象类不是运行时存在的事物。通过类创建其对象。对象是运行时存在的具体事物。类:数据类型对象:变量203.3对象类不是运行时存在的事物。类:数据类型20203.3.1创建对象对象的创建分两步对象声明类名对象名;对象创建对象名=new类名([实参列表]);注:也可以合成一步类名对象名=new类名([实参列表]);Rectangler;r=newRectangle();Rectangler1=newRectangle();Rectangler1,r2;Rectangler1=newRectangle(),r2=newRectangle();213.3.1创建对象对象的创建分两步对象声明注:也可以合成一21对象创建的分析—引用类型对象的创建分两步:1、对象的声明:类型变量名;但对象声明并不会真正创建对象,(不会给对象分配内存)只是创建一个引用(它的值用来指向对象)2、对象创建:运算符new创建对象(为对象分配内存空间)new运算符创建对象,并返回对象的引用,将这个引用赋值给同类型的引用变量,那么通过该引用变量可以找到创建的对象引用w值h值实际对象r1Rectangler1;r1=newRectangle();22对象创建的分析—引用类型对象的创建分两步:引用w值实际对象r223.3.2使用对象对象是拥有数据成员和成员方法的实体。故对象的使用:访问对象的数据成员调用对象的成员方法1、访问数据成员

对象名.数据成员名Rectangler=newRectangle();r.width=5;r.height=10;Rectangler1=newRectangle();r1.width=2;r1.height=3;510r23r1233.3.2使用对象对象是拥有数据成员和成员方法的实体。故对232、调用成员方法

对象名.成员方法名([实参列表])

参数传递 实参与形参一一对应,类型匹配方法的返回值 方法调用表达式:可以独立为语句,或基于返回值继续参与表达式等方法调用的执行过程classRectangle{......voidset(intw,inth){ width=w; height=h;}intarea(){ returnwidth*height;}......}Rectangler=newRectangle();r.set(5,10);intd;d=r.area();242、调用成员方法classRectangle{Rectan243、让程序运行起来创建对象,执行功能消息通信避免直接访问数据成员定义主类创建一个包含main方法的类在main方法中创建对象,完成功能classA{}publicclassTest{ publicstaticvoidmain(Stringargs[]){ Aa=newA(); }}253、让程序运行起来classA{2525classRectangle{ intwidth; intheight; voidset(intw,inth){ width=w; height=h; } intarea(){ inta=width*height; returna; } intperimeter(){ inta=2*width*height; returna; } voiddisplay(){ System.out.println("矩形宽为"+width+",高为"+height); } voidcomputeAndDisplay(){ inta=area(); intp=perimeter(); System.out.println("面积为"+a+",周长为"+p); }}26classRectangle{2626publicclassTest{//主类

publicstaticvoidmain(Stringargs[]){

Rectangler=newRectangle(); r.set(25,36); r.display(); rputeAndDisplay(); System.out.println("--------------------------"); Rectangler1=newRectangle(); r1.set(18,47); r1.display(); r1puteAndDisplay(); System.out.println("--------------------------"); System.out.println("前面两个矩形中,面积较大的矩形为:");

if(r.area()>r1.area()) r.display(); else r1.display(); }}27publicclassTest{//主类2727编译:两个类在一个文件里:Test.java(以public类的类名命名)一个文件最多一个public类(这里把主类设为public类)

javacTest.java两个类各在一个文件里:Test.java,Rectangle.java javacRectangle.java javacTest.java运行

javaTest;

(Test是main函数所在类)编译完成后,每个类生成一个字节码文件Test.classRectangle.class28编译:编译完成后,每个类生成一个字节码文件28283.4方法重载一个类中,多个方法使用同一个名字,称为方法的重载。方法重载的区分参数个数不同,或参数类型不同,这样的重载是有效的方法重载。注意:方法名的不同,或返回值类型的不同是不能区分重载方法的。classA{ voidf(inta,intb){……} voidf(inta,intb,intc){……} voidf(doublea,doubleb){……}}Aa=newA();a.f(1,1);a.f(1,2,3);a.f(1.234,0.67);293.4方法重载一个类中,多个方法使用同一个名字,称为方法的29classRectangle{ ...... voidscale(ints){ width=width*s; height=height*s; } voidscale(ints,chartype){ if(type=='w') width=width*s; elseif(type=='h') heigh=height*s; }}30classRectangle{30303.5对象的初始化与清除初始化:变量(对象)在使用前应该具有确定的值。清除:当变量或对象用完,其内存应回收局部变量初始化:方法体内定义的局部变量在使用前必须已经赋值,否则编译错误。清除:方法体内局部变量在方法结束时由系统清除。对象初始化:清除:313.5对象的初始化与清除初始化:变量(对象)在使用前应该具313.5.1构造方法构造方法与类同名,且没有返回值。形如:类名([形参列表]){ ……//语句}有关构造方法的几条规则:对象创建时一定会调用构造方法。构造方法也只能在创建对象时,由Java系统自动调用,以后不能再主动调用。对象创建时必须与构造方法格式一致,即构造方法若有形参列表,则创建对象时应传递匹配的实参列表。若类没有定义构造方法也是可以的,Java系统会自动为类创建一个不带参数的构造方法,当然这个方法的方法体是空的,什么初始化操作也不做。323.5.1构造方法构造方法与类同名,且没有返回值。形如:332构造方法的重载一个类可以有多个构造方法,创建对象时,要与其中一种构造方法匹配。一旦已经定义了构造方法,Java系统就不会再自动创建不带参数的构造方法了(即使类中定义的构造方法中并没有不带参数的构造方法)。不带参数的构造方法(简称无参构造方法,也常称为默认构造方法,缺省构造方法)是很重要的构造方法,很多情况下会自动调用它。33构造方法的重载一个类可以有多个构造方法,创建对象时,要与其中33classRectangle{ intwidth; intheight; Rectangle(){//构造方法(1),不带参数

width=1; height=1; } Rectangle(intw,inth){//构造方法(2),带两个参数

width=w; height=h; } voiddisplay(){ System.out.println("矩形宽为"+width+",高为"+height); }}publicclassTest{ publicstaticvoidmain(Stringargs[]){

Rectangler=newRectangle(); Rectangler1=newRectangle(3,5) r.display(); r1.display(); }}34classRectangle{34343.5.2对象的初始化所有的数据在使用前都应有值对象属性在使用前应有值(如:访问对象属性,调用对象成员方法)对象初始化的三种方法数据成员默认值在说明数据成员时直接初始化使用构造方法353.5.2对象的初始化所有的数据在使用前都应有值3535类型默认值byte(byte)0short(short)0int0long0Lfloat0.0fdouble0.0char‘\u0000’booleanfalse引用null1、默认值初始化在对象创建时,其数据成员会自动被初始化为默认值classA{ intx; voiddisplay(){ System.out.println(x); }}publicclassTest{publicstaticvoidmain(Stringargs[]){Aa=newA();a.display();intx;System.out.println(x);}}注:方法内创建的局部变量不会自动初始化36类型默认值byte(byte)0short(short)0i362、在说明类的数据成员时直接初始化classA{

inta=10; Rectangler=newRectangle(3,5); voidf(){……}}3、使用构造方法初始化4、初始化的执行先默认值初始化再根据声明时赋值情况,设置数据成员的值最后调用构造方法classA{ intx; inty=10; intz; Rectangler; A(){x=100;r=newRectangle();}}372、在说明类的数据成员时直接初始化classA{3、使用373.5.3对象的清除Java中的对象必须通过new关键字创建而Java运行时系统提供了垃圾收集机制,能监测所有用new创建的对象的使用状态,当对象不再需要的时候会自动清除它们,收回内存。383.5.3对象的清除Java中的对象必须通过new关键字创383.6this引用在类的方法中(不包含静态方法)都隐含了一个this引用,这个引用的类型为当前类,其指向的是调用方法的当前对象。this的使用方法与普通引用的使用是相同的。在类的方法中可以自由使用这个引用来访问当前对象的数据成员,或针对当前对象来调用方法。...intarea(){ inta=this.width*this.height; returna;}...Rectangler=newRectangle(2,3);intd=r.area();//隐含效果Rectangle.area(r);393.6this引用在类的方法中(不包含静态方法)都隐含了一39this的使用返回当前对象自己区分同名数据成员与形参在构造方法中使用构造方法classA{ intx; voidf(intx){

this.x=x; }}classRectangle{ intwidth; intheight; Rectangle(intw,inth){ width=w; width=h; } Rectangle(){

this(1,1);//调用第一个构造方法

}}40this的使用返回当前对象自己classA{classR403.7引用类型理解与应用基本类型:变量声明的同时创建了特定类型的数据(进行了内存分配)引用类型:所有其他类型都为引用类型(类,数组,接口),其特点为:进行变量声明的时候只创建引用变量,而不创建具体对象。具体对象需要用new创建(分配内存)引用与对象分离,其对应关系不固定,可以变化。这样就有可能产生一些前面讲基本类型时没有遇到过的问题: (1)一个引用先后指向不同的对象的情况。 (2)多个引用指向同一个对象的情况。413.7引用类型理解与应用基本类型:变量声明的同时创建了特定413.7.1理解引用类型引用支持的运算赋值==,!=1、赋值运算(1)被new创建的对象赋值。(表示:引用指向了一个对象)(2)被同类型的引用变量赋值。(注意:这会引起两个引用指向同一个对象)(3)被赋值以null。(表示引用不再指向任何对象)423.7.1理解引用类型引用支持的运算4242classRectangle{ intwidth; intheight; Rectangle(intwidth,intheight){ this.width=width;this.height=height; } voidset(intwidth,intheight){ this.width=width;this.height=height; } voiddisplay(){ System.out.println("矩形宽为"+width+",高为"+height); }}publicclassTest{ publicstaticvoidmain(Stringargs[]){ ......}43classRectangle{4343Rectanglea=newRectangle(1,2);Rectangleb=newRectangle(3,4);a=b;a.display();b.display();a.set(5,6);a.display();b.display();a=null;b=null;a.display();//错误1234ab1234ab56ab一个对象如没有任何引用指向它,对象就是无用的,无用的内存由Java垃圾收集机制回收。当对象使用完毕时,可以将引用变量赋值为nullnullnullab5644Rectanglea=newRectangle(1,2)442、比较运算中的==,!=两个引用变量可以进行相等与不等的比较,其比较的是引用的值,而不是引用所指向的对象是否相等引用变量可以与null进行相等与不等的比较,来判断引用变量是否指向了对象Rectanglea=newRectangle(3,4);Rectangleb=newRectangle(3,4);if(a==b)System.out.println(“相等1”);a=b;if(a==b)System.out.println(“相等2”);a=null;a.display();//错误if(a!=null)a.display();452、比较运算中的==,!=Rectanglea=ne453.7.2方法参数传递参数传递方式按值传递:Java的基本类型数据采用这种传递方式。其特点是,实参将其值传递给形参,形参是实参的一个本地拷贝,对形参的操作对实参没有影响。按引用传递:Java的引用类型的对象都采用这种传递方式。其特点是:参数传递时,实际传递的是对象的引用,而不是对象本身。形参是“实参引用”的一个本地拷贝,这样形参会指向实参对象,通过形参引用对对象的操作会作用到实际的实参对象上。463.7.2方法参数传递参数传递方式4646【例3-4】按值传递对实参的影响classA{ voidparameterChangeTest(intn){ n=10; }}publicclassTest{ publicstaticvoidmain(Stringargs[]){ Aa=newA(); intb=13;

a.parameterChangeTest(b); System.out.println(b); }}形参n与实参b没有直接联系,对n的改变对b没影响47【例3-4】按值传递对实参的影响形参n与实参b没有直接联系,47【例3-5】按引用传递对实参的影响classA{ voidparameterChangeTest(Bn){ n.i=10; }}classB{ inti;}publicclassTest{ publicstaticvoidmain(Stringargs[]){ Aa=newA(); Bb=newB(); b.i=100; a.parameterChangeTest(b); System.out.println(b.i); }}形参n即代表实参对象b,通过n改变数据成员,就是改变实参对象48【例3-5】按引用传递对实参的影响形参n即代表实参对象b,通48【例3-6】按引用传递对实参的影响classA{ voidparameterChangeTest(Bn){ n=newB(); n.i=10; }}classB{ inti;}publicclassTest{ publicstaticvoidmain(Stringargs[]){ Aa=newA(); Bb=newB();

b.i=100; a.parameterChangeTest(b); System.out.println(b.i);

}}对形参引用的重新赋值对实参并没有影响。49【例3-6】按引用传递对实参的影响对形参引用的重新赋值对实参49引用类型做参数应用classRectangle{ intwidth; intheight; Rectangle(){width=0;height=0;} Rectangle(intw,inth){width=w;height=h;} Rectangle(Rectangler){ width=r.width; height=r.height; } voidset(intwidth,intheight){ this.width=width; this.height=height; }

voidset(Rectangler){ width=r.width; height=r.height; }50引用类型做参数应用classRectangle{5050 booleanequals(Rectangler){ return(width==r.width)&&(height==r.height); } voiddisplay(){ System.out.println("矩形宽为"+width+",高为"+height); }}publicclassTest{ publicstaticvoidmain(Stringargs[]) { Rectanglea=newRectangle(); Rectangleb=newRectangle(3,5); Rectanglec=newRectangle(b); System.out.println(b==c); System.out.println(b.equals(c)); }}51 booleanequals(Rectangler){513.7.3返回值为引用类型方法的返回值也可以为引用类型。当需要返回对象时,返回的实际是对象的引用,而不是对象本身。当将这个返回的引用赋值给某个声明的引用变量时,这个引用变量会指向这个返回值(引用)指向的对象。523.7.3返回值为引用类型方法的返回值也可以为引用类型。552【例3-8】引用类型做返回值(返回当前对象)classRectangle{ intwidth; intheight; Rectangle(intw,inth){width=w;height=h;} voidset(intwidth,intheight){ this.width=width; this.height=height; } voiddisplay(){ System.out.println("矩形宽为"+width+",高为"+height); }

Rectanglescale(ints){ width=width*s; height=height*s;

returnthis; }53【例3-8】引用类型做返回值(返回当前对象)5353

Rectanglescale(ints,chartype){ if(type=='w') width=width*s; elseif(type=='h') height=height*s;

returnthis; }}publicclassTest{ publicstaticvoidmain(Stringargs[]){ Rectanglea=newRectangle(3,5); a.display();

Rectangleb=a.scale(3); b.display(); b.set(1,1);//语句(a)

a.display(); //语句(b)

b.display();//语句(c)

}}54 Rectanglescale(ints,charty54【例3-9】引用类型做返回值(返回新对象)classRectangle{ intwidth; intheight; Rectangle(intw,inth){width=w;height=h;} voiddisplay(){ System.out.println("矩形宽为"+width+",高为"+height); } Rectanglescale(ints){

Rectangler=newRectangle(width*s,height*s); returnr; } Rectanglescale(ints,chartype){

Rectangler; if(type=='w')

r=newRectangle(width*s,height); elseif(type=='h')

r=newRectangle(width,height*s); elser=newRectangle(width,height);

returnr; }}55【例3-9】引用类型做返回值(返回新对象)5555publicclassTest{ publicstaticvoidmain(Stringargs[]) { Rectanglea=newRectangle(3,5); a.display();

Rectangleb=a.scale(3); b.display(); a.display(); }}56publicclassTest{56563.7.4类的数据成员为引用类型一个类的数据成员可以为基本类型,也可以为引用类型(如类的数据成员类型可以为已定义的其它类)。这使我们不必从头定义一个类,而是可以使用已定义的其他类来描述类的数据成员,使类的定义更加方便。573.7.4类的数据成员为引用类型一个类的数据成员可以为基本57classRectangle{ …… //此类与前面定义相同,这里省略}classWallPaint{

Rectanglewall; doubleunitPrice; WallPaint(){

wall=newRectangle(0,0); unitPrice=0; } WallPaint(intw,inth,doublep){

wall=newRectangle(w,h);

unitPrice=p; } voidsetUnitPrice(doublep){ unitPrice=p; } voidchangeWall(intw,inth){

wall.set(w,h);//修改矩形对象

}58classRectangle{5858 doublecomputePay(){ returnunitPrice*wall.area();

} voiddisplay(){ System.out.print("墙体彩绘业务:\n墙体");

wall.display(); System.out.println("此笔业务单价"+unitPrice); }}publicclassTest{ publicstaticvoidmain(Stringargs[]){ WallPaintw=newWallPaint(2,3,125);

w.display(); System.out.println("总价格为:"+wputePay()); }}59 doublecomputePay(){59593.8作用域与生存期作用域:标识符的使用范围生存期:运行时,标识符的存在区间603.8作用域与生存期作用域:标识符的使用范围60603.8.1作用域局部域:方法体内定义的标识符(补充2.6)(1)方法的形参作用域为整个方法,其在方法调用时通过参数传递初始化。(2)异常处理参数作用域为其后跟的{}表示的语句块,其在异常参数传递时初始化。类域:在类体中(方法外)定义的标识符为类的数据成员和成员方法,其作用域为类域。(1)类的数据成员和成员方法标识符的作用域以类为单位,在整个类内有效(允许类的所有成员方法直接访问)。(2)类的数据成员互相不能同名,类的成员方法也互相不能同名(因为在同一作用域)。(3)成员方法的局部变量可以与类的数据成员同名,但该类的数据成员在方法体内被暂时屏蔽。但可以通过this引用来访问该类的被屏蔽的数据成员。613.8.1作用域局部域:方法体内定义的标识符(补充2.6)61【例3-12】局部引用变量与对象classA{ inti; A(inti1){i=i1;} voiddisplay(){System.out.println(i);}}publicclassTest{ publicstaticvoidmain(Stringargs[]){ Aa; { Ab=newA(10);

b.display(); a=b; } a.display(); }}62【例3-12】局部引用变量与对象62623.8.2生命期1、局部变量生命期局部变量的生命期与其作用域有关。其在程序执行流程中,当到达作用域时变量开始使用,生命期开始,超出作用域则不再使用,生命期结束。内存栈区2、数据成员生命期与对象生命期数据成员生命期:数据成员随对象创建而分配内存,随对象销毁而销毁,其生命期与对象生命期一致。对象生命期:new创建时生命期开始,没有引用指向时生命期结束。内存堆区:垃圾收集机制633.8.2生命期1、局部变量生命期6363classRectangle{ ……//内容略

}classA{ Rectangler;

voidset(Rectanglere){r=re;}}publicclassTest{ publicstaticvoidmain(Stringargs[]){ Rectangler1=newRectangle(1,1); Ab=newA(); b.set(r1); Ac=newA(); c.set(r1); }}width:1height:1r1rbRectangle对象rc类A对象堆区栈区……64classRectangle{width:1r1rbRec643.9静态数据成员与静态方法实例数据成员,实例方法类数据成员,类方法(静态数据成员,静态方法)653.9静态数据成员与静态方法实例数据成员,实例方法65653.9.1静态数据成员类的静态数据成员概念数据成员属于类,而不属于任何特定的对象,由类的所有对象共享。类:Student属性:学号,姓名,成绩学生数方法:显示学生信息对象:aaa“001”,“aaa”,89对象:bbb“002”,“bbb”,78663.9.1静态数据成员类的静态数据成员概念类:Studen661、类的静态数据成员声明用static修饰符修饰类的数据成员2、类的静态数据成员访问类静态数据成员可通过类名直接访问,也可以通过对象访问,在类的方法中直接访问。注意:类的静态数据成员值被所有对象共享,任何对象都可以访问类的静态数据成员,但要注意,它们使用的是同一个数据,操作的是同一块内存。无论哪个对象修改了它,对其它对象来说,它也已经变了。671、类的静态数据成员声明6767【例3-14】类的静态数据成员访问classA{ staticinti; voidchange(inti1){i=i1;}}publicclassTest{ publicstaticvoidmain(Stringargs[]){ A.i=10; Aa=newA(); Ab=newA(); 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-14】类的静态数据成员访问68683、静态数据成员的初始化默认初始值,声明时直接初始化,静态初始化器。静态初始化器:Java允许通过静态初始化器初始化静态数据成员。静态初始化器语法:classA{ staticinti; staticintj=10; staticintk; staticintm; static{

k=20;

m=30; }}static{...//静态数据成员初始化语句}693、静态数据成员的初始化classA{static{69694、实例数据成员与静态数据成员的对比类静态数据成员与实例数据成员二者区别:(1)不管有多少类的实例,类的静态数据成员只有一份拷贝,即所有对象共享相同的静态数据成员;而每个实例对象都有自己的实例数据成员。(2)类的静态数据成员仅在类初次使用时创建、初始化以后不会再初始化了。而每当创建类的对象时都为实例数据成员分配存储空间,并初始化。(3)实例数据成员只能通过对象来访,而类静态数据成员既可以通过类名来访问,也可以通过对象来访问。704、实例数据成员与静态数据成员的对比7070【例3-15】实例数据成员与静态数据成员的对比classA{ staticinti; intj; A(){i=10;j=10;} voidadd(){i++;j++;} voiddisplay(){System.out.println("i="+i+",j="+j);}}publicclassTest{ publicstaticvoidmain(Stringargs[]) { Aa=newA(); Ab=newA(); a.add(); a.display(); b.display(); b.add(); a.display(); b.display(); }}jjiab引用对象静态属性71【例3-15】实例数据成员与静态数据成员的对比jjiab引用713.9.2静态方法1、静态方法定义 在方法声明前用static修饰符修饰,则方法为静态方法。如:

classA{ staticvoidf(){} }注意:类的静态方法,属于整个类,而不针对特定对象,因此不能操作与对象直接相关的内容: (1)不能访问类的实例数据成员,不能调用类的实例方法。 (2)静态方法没有this引用,因为this代表当前对象,而静态方法并不与特定对象产生联系。 (3)静态方法可以做的是:访问类的静态数据成员,调用类的静态方法。当然除此以外可以定义方法内的局部变量,也可以声明并操作方法的参数。723.9.2静态方法1、静态方法定义72722、静态方法的调用 静态方法可以通过类名调用,也允许通过对象调用,也可以被类的其他方法直接调用。3、静态方法的应用 静态方法的一个重要特点就是不用创建对象就可以调用。这是一个至关重要的用途,有时候类中会有一些方法需要在没有对象时也能使用。 如:应用程序执行的入口点main方法必须是静态的。因为在其执行时,还没有任何对象被创建出来。静态方法常用于描述一些通用的算法。静态方法也常用于访问静态数据成员。732、静态方法的调用7373【例3-16】静态方法classA{ inti=100; staticvoidf(){System.out.println("hello");} voiddisplay(){System.out.println(i);f();}}publicclassTest { publicstaticvoidmain(Stringargs[]){ A.f(); Aa=newA(); a.f(); a.display(); }}74【例3-16】静态方法7474【例3-17】返回两个整数的较大值的静态方法publicclassTest{ staticintmax(inta,intb){ if(a>b) returna; else returnb; } publicstaticvoidmain(Stringargs[]){

inta=10,b=12,c=3,max; max=max(a,b); max=max(max,c);

System.out.println(max); }}75【例3-17】返回两个整数的较大值的静态方法7575classCount{inti=0;staticintcounter=0;staticvoidadd(){ counter++;}staticvoiddisplay(){ System.out.println(counter);}voidaddi(){ i++;}voiddisplayi(){ System.out.println(i);}}publicclassTest{ publicstaticvoidmain(Stringargs[]) {

Count.display(); Count.add(); Count.display();

Counta=newCount(); a.add(); a.display(); a.addi(); a.displayi(); Countb=newCount(); b.add(); b.display(); b.addi(); b.displayi();

a.display(); }}76classCountpublicclassTest7763.10final修饰符Java提供了final修饰符,final表示最终的。这个修饰符可以用来修饰局部变量数据成员类方法773.10final修饰符Java提供了final修饰符,771.final修饰局部变量终态局部变量,其特点是初始化其值以后就不能再修改其值,相当于标识符常量publicclassTest{ publicstaticvoidmain(Stringargs[]){ finalinti; i=10; i=11;//错

}}781.final修饰局部变量publicclassTes782.final修饰类的数据成员终态数据成员,其值在程序执行期间不能改变。final数据成员必须在声明变量时,或在构造方法中初始化,以后在任何其他地方不能再修改它的值。792.final修饰类的数据成员7979classT{ finalintn=10; finalintm; T(inta){ m=a;

n=20;//错 } voidf(){

n=21;m++;//错

}}classTest{ publicstaticvoidmain(Stringargs[]) { Tt=newT(10);

t.m=100;//错

}}80classT{80803.final修饰类的方法final修饰符可以修饰方法,将final修饰符放于方法声明前。final修饰的方法为终态方法,其特点为此方法不能被其子类覆盖。4.final修饰类final修饰符还可以直接修饰类,将final修饰符放于类声明的前面。用final修饰的类为终态类,其特点为此类不能被继承,不能创建此类的子类。813.final修饰类的方法81813.11应用实例1、对象之间的联系与对象之间的协作对象之间的联系方式会体现在类的定义上,如前面讲到的:引用类型做参数,引用类型做数据成员,引用类型做返回值,引用类型做局部变量。这些途径能够使一个对象与其他对象联系起来。组成关系关联关系823.11应用实例1、对象之间的联系与对象之间的协作8282【例3-18】假设一个公司有若干职员,若干办公室,职员与办公室有关联,这个关联表示职员所在的办公地点,程序希望通过职员能获得其办公地点的信息,并能为职员调整办公室。分别设计职员类和办公室类,通过在职员类中添加办公室类引用作为数据成员,表示职员的办公地点。83【例3-18】假设一个公司有若干职员,若干办公室,职员与办公83classRoom{ Stringid; intpersonCount; intcurrentCount=0; Room(Stringid,intpc){ this.id=id; personCount=pc; } voidaddPerson(){ currentCount++; } voidremovePerson(){ currentCount--; } StringgetId(){ returnid; } voiddisplay(){ System.out.print("房间号:"+id); System.out.print(",额定人员"+personCount+"名"); System.out.println(",目前人员"+currentCount+"名"); }}84classRoom{8484classEmployee{ Stringname; Roomroom=null; Employee(Stringna){ name=na; } voidsetRoom(Roomr){ if(room!=null) room.removePerson(); room=r; room.addPerson(); } voiddisplay(){ System.out.println("职员"+name+",工作地点"+room.getId()); }}85classEmployee{8585publicclassTest{ publicstaticvoidmain(Stringargs[]){ Employeea=newEmployee("小张");//字符串常量做参数

Employeeb=newEmployee("小李"); Employeec=newEmployee("小马"); Roomr1=newRoom("101",3); Roomr2=newRoom("102",4);

a.setRoom(r1);//小张在101 b.setRoom(r1);//小李在101

c.setRoom(r2);//小马在102 a.display(); b.display(); c.display(); r1.display();

r2.display(); c.setRoom(r1);//小马改在101 c.display(); r1.display(); r2.display(); }}86publicclassTest{ 8686第3章类与对象87第3章类与对象1873.1面向对象思想概述程序面对的问题域—客观世界客观世界有很多事物事物有自己的状态和行为事物间有各种联系通过事物间的联系,事物产生相互作用在一个面向对象系统对象是现实世界的事物的抽象事物的状态抽象为对象的属性和方法事物间的关系通过对象间的关系表示事物间的相互作用通过对象间的消息通信支持。883.1面向对象思想概述程序面对的问题域—客观世界2883.1.1对象客观世界由具体事物构成,每个事物由自己的一组状态和行为。把问题域中的事物抽象为对象,状态抽象为一组数据(属性),行为抽象为一组操作服务(方法)对象:对象标识:对象名属性:一组数据(数据成员)方法:操作,服务(成员方法)一辆汽车静态特征:颜色:蓝色型号:XXXX马力:100动态特征:行驶转弯停车car1属性:“blue”,”XXXX“,100方法:move,turn,stop893.1.1对象客观世界由具体事物构成,每个事物由自己的一组893.1.2类把具有共同性质的事物归为一类,得出一个抽象的概念(抽象与分类原则)对象是对事物的抽象类是对对象的抽象面向对象语言中类是对同类的所有对象的抽象描述属性描述方法描述类类标识:类名属性说明(属性名,属性类型)方法说明与实现对象:car1属性:“blue”,”XXXX“,3方法:move,turn,stop对象:car2属性:“red”,”YYYY“,2.5方法:move,turn,stop类:Car属性说明:color字符串,type字符串,horsePower整数方法说明与实现:move,turn,stop903.1.2类把具有共同性质的事物归为一类,得出一个抽象的概90类与对象的关系抽象与具体的关系类是同类对象的抽象描述对象是符合类描述的具体事物我们称:对象是类的实例程序先定义类创建类的对象,完成系统功能模具----零件类型-----变量91类与对象的关系抽象与具体的关系模具----零件5913.1.3消息通信把对象之间产生相互作用所传递的信息称做消息。通过给对象发送消息请求对象提供服务,实现对象间的协作,完成相应的功能。消息格式:接收消息的对象,请求的功能,传递的数据返回的结果car2.move其他对象或全局函数对象:car2属性:“red”,”YYYY“,2.5方法:move,turn,stop消息对象的方法就是对象能提供的功能(服务),给对象发消息就是调用对象的方法。923.1.3消息通信把对象之间产生相互作用所传递的信息称做消923.1.4对象之间的关系事物之间的关系体现为对象之间的关系对象之间有关系,才能进行消息通信对象间关系的表示933.1.4对象之间的关系事物之间的关系体现为对象之间的关系933.2类Java程序设计过程就是定义类的过程定义类定义类的对象及之间交互Java的类系统定义的类(通用的类:输入输出,界面等)自定义的类(特定应用相关的类)943.2类Java程序设计过程就是定义类的过程894【例3-1】矩形形状类classRectangle{ intwidth; intheight; voidarea(){ inta=width*height; System.out.println("面积为"+a); } voidperimeter(){ inta=2*(width+height); System.out.println("周长为"+a); }}95【例3-1】矩形形状类9953.2.1类定义[修饰符]class类名[extends父类名][implements接口名列表]{

数据成员声明 成员方法声明与实现}类头必须项:class类名可选项[extends父类名][implements接口名列表]类的修饰符:[public][abstract|final]类体963.2.1类定义[修饰符]class类名[ext963.2.2数据成员定义数据成员要在类体中声明

[修饰符]数据类型变量名;必须项:数据类型变量名;可选项:数据成员修饰符:[public|protected|private][static][final][transient][volatile]973.2.2数据成员定义数据成员要在类体中声明11973.2.3成员方法的定义[修饰符]返回类型方法名([形参列表])[抛出异常列表]{

语句序列}983.2.3成员方法的定义[修饰符]返回类型方法名([形981、方法头必须项:返回类型方法名()方法名()返回类型:方法返回结果的类型。若不需要返回值,则为void可选项:形参列表:

类型名形参名1,类型名2形成名2...[抛出异常列表]方法的修饰符:[public|protected|private] [static][final|abstract][native][synchronized]991、方法头必须项:返回类型方法名()13992、方法体语句使用参数返回值与return语句

return表达式; 结束方法执行,将表达式的值作为方法的返回结果。(适于返回类型为非void)

return; 结束方法执行。(适于返回类型为void)voiddrawRect(charc){ intside=5;

for(inti=0;i<side;i++){

for(intj=0;j<side;j++)

System.out.print(c); System.out.println(); }}1002、方法体语句voiddrawRect(charc){100if(x<0)returnx;elsereturn-xif(x<0)returnx;return–x;intf(intx){ if(x<0) returnx;}intf(intx){ if(x<0) returntrue; else returnfalse;}return语句会结束方法执行所有控制路径都应有返回值返回值的类型应与方法头声明的返回类型兼容(相同,或能自动转换)101if(x<0)if(x<0)intf(intx1013、成员方法对数据成员的访问类的成员方法可以自由使用类的数据成员classRectangle{

intwidth; intheight; voidarea(){ inta=width*height; System.out.println("面积为"+a); } voidperimeter(){ inta=2*(width+height); System.out.println("周长为"+a); }}1023、成员方法对数据成员的访问类的成员方法可以自由使用类的数据1024、类的成员方法对成员方法的调用类的成员方法可以自由调用自己类的方法。

方法名([实参列表])

方法调用可以作为独立语句。若有返回值,可用返回值继续参与其他运算。classRectangle{ intwidth; intheight; voidarea(){ inta=width*h

温馨提示

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

评论

0/150

提交评论