版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 类与对象13.1 面向对象思想概述程序面对的问题域客观世界客观世界有很多事物事物有自己的状态和行为事物间有各种联系通过事物间的联系,事物产生相互作用在一个面向对象系统对象是现实世界的事物的抽象事物的状态抽象为对象的属性和方法事物间的关系通过对象间的关系表示事物间的相互作用通过对象间的消息通信支持。23.1.1 对象客观世界由具体事物构成,每个事物由自己的一组状态和行为。把问题域中的事物抽象为对象,状态抽象为一组数据(属性),行为抽象为一组操作服务(方法)对象:对象标识:对象名属性:一组数据(数据成员)方法:操作,服务(成员方法)一辆汽车静态特征:颜色:蓝色型号:XXXX马力:100动态
2、特征:行驶转弯停车car1属性:“blue”,”XXXX“,100方法:move,turn,stop33.1.2 类把具有共同性质的事物归为一类,得出一个抽象的概念(抽象与分类原则)对象是对事物的抽象类是对对象的抽象面向对象语言中类是对同类的所有对象的抽象描述属性描述方法描述类类标识:类名属性说明(属性名,属性类型)方法说明与实现对象:car1属性:“blue”,”XXXX“,3方法:move,turn,stop对象:car2属性:“red”,”YYYY“,2.5方法:move,turn,stop类:Car属性说明:color 字符串,type 字符串,horsePower 整数方法说明与实现
3、:move,turn,stop4类与对象的关系抽象与具体的关系类是同类对象的抽象描述对象是符合类描述的具体事物我们称:对象是类的实例程序先定义类创建类的对象,完成系统功能模具-零件类型-变量53.1.3 消息通信把对象之间产生相互作用所传递的信息称做消息。通过给对象发送消息请求对象提供服务,实现对象间的协作,完成相应的功能。消息格式:接收消息的对象,请求的功能,传递的数据返回的结果car2.move其他对象或全局函数对象:car2属性:“red”,”YYYY“,2.5方法:move,turn,stop消息对象的方法就是对象能提供的功能(服务),给对象发消息就是调用对象的方法。63.1.4 对象
4、之间的关系事物之间的关系体现为对象之间的关系对象之间有关系,才能进行消息通信对象间关系的表示73.2 类Java程序设计过程就是定义类的过程定义类定义类的对象及之间交互Java的类系统定义的类(通用的类:输入输出,界面等)自定义的类(特定应用相关的类)8【例3-1】矩形形状类class Rectangleint width;int height;void area()int a=width*height;System.out.println(面积为+a);void perimeter()int a=2*(width+height);System.out.println(周长为+a);93.2.
5、1 类定义修饰符 class 类名 extends 父类名 implements 接口名列表 数据成员声明成员方法声明与实现类头必须项:class 类名可选项extends 父类名 implements 接口名列表类的修饰符:public abstract | final 类体103.2.2 数据成员定义数据成员要在类体中声明修饰符 数据类型 变量名; 必须项:数据类型 变量名;可选项:数据成员修饰符:public | protected | private static final transient volatile 113.2.3 成员方法的定义修饰符 返回类型 方法名(形参列表) 抛出
6、异常列表语句序列121、方法头必须项:返回类型 方法名()方法名()返回类型:方法返回结果的类型。若不需要返回值,则为void可选项:形参列表:类型名 形参名1,类型名2 形成名2 . 抛出异常列表方法的修饰符:public | protected | private static final|abstract nativesynchronized 132、方法体语句使用参数返回值与return语句return 表达式;结束方法执行,将表达式的值作为方法的返回结果。(适于返回类型为非void)return;结束方法执行。(适于返回类型为void)void drawRect(char c) in
7、t side=5;for(int i=0;iside;i+)for(int j=0;jside;j+)System.out.print(c);System.out.println();14if (x0) return x;else return -x if (x0) return x; return x;int f ( int x )if(x0)return x;int f ( int x )if(xr1.area()r.display();elser1.display();27编译:两个类在一个文件里:Test.java(以public类的类名命名)一个文件最多一个public类(这里把主类
8、设为public类)javac Test.java两个类各在一个文件里:Test.java,Rectangle.javajavac Rectangle.javajavac Test.java运行java Test;(Test 是main函数所在类)编译完成后,每个类生成一个字节码文件Test.classRectangle.class283.4 方法重载一个类中,多个方法使用同一个名字,称为方法的重载。 方法重载的区分参数个数不同,或参数类型不同,这样的重载是有效的方法重载。注意:方法名的不同,或返回值类型的不同是不能区分重载方法的。class Avoid f(int a, int b) voi
9、d f(int a,int b,int c) void f(double a, double b) A a=new A();a.f(1,1);a.f(1,2,3);a.f(1.234,0.67); 29class 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;303.5 对象的初始化与清除初始化:变量(对象)在使用前应该具有确定
10、的值。清除:当变量或对象用完,其内存应回收局部变量初始化:方法体内定义的局部变量在使用前必须已经赋值,否则编译错误。清除:方法体内局部变量在方法结束时由系统清除。对象初始化:清除:313.5.1 构造方法构造方法与类同名,且没有返回值。形如:类名(形参列表)/语句有关构造方法的几条规则:对象创建时一定会调用构造方法。构造方法也只能在创建对象时,由Java系统自动调用,以后不能再主动调用。对象创建时必须与构造方法格式一致,即构造方法若有形参列表,则创建对象时应传递匹配的实参列表。若类没有定义构造方法也是可以的,Java系统会自动为类创建一个不带参数的构造方法,当然这个方法的方法体是空的,什么初始
11、化操作也不做。32构造方法的重载一个类可以有多个构造方法,创建对象时,要与其中一种构造方法匹配。一旦已经定义了构造方法,Java系统就不会再自动创建不带参数的构造方法了(即使类中定义的构造方法中并没有不带参数的构造方法)。不带参数的构造方法(简称无参构造方法,也常称为默认构造方法,缺省构造方法)是很重要的构造方法,很多情况下会自动调用它。33class Rectangleint width;int height;Rectangle() /构造方法(1),不带参数width=1;height=1;Rectangle(int w,int h) /构造方法(2),带两个参数width=w;heigh
12、t=h;void display()System.out.println(矩形宽为+width+,高为+height);public class Testpublic static void main(String args)Rectangle r=new Rectangle(); Rectangle r1=new Rectangle(3,5)r.display();r1.display();343.5.2 对象的初始化所有的数据在使用前都应有值对象属性在使用前应有值(如:访问对象属性,调用对象成员方法)对象初始化的三种方法数据成员默认值在说明数据成员时直接初始化使用构造方法35类型默认值by
13、te(byte)0short(short)0int0long0Lfloat0.0fdouble0.0charu0000booleanfalse引用null1、默认值初始化在对象创建时,其数据成员会自动被初始化为默认值class Aint x;void display()System.out.println(x);public class Testpublic static void main(String args)A a=new A();a.display();int x;System.out.println(x);注:方法内创建的局部变量不会自动初始化362、在说明类的数据成员时直接初始化
14、class A int a=10;Rectangle r = new Rectangle(3,5);void f()3、使用构造方法初始化4、初始化的执行先默认值初始化再根据声明时赋值情况,设置数据成员的值最后调用构造方法class A int x;int y=10;int z;Rectangle r;A() x=100; r=new Rectangle(); 373.5.3 对象的清除Java中的对象必须通过new关键字创建而Java运行时系统提供了垃圾收集机制,能监测所有用new创建的对象的使用状态,当对象不再需要的时候会自动清除它们,收回内存。383.6 this引用在类的方法中(不包含
15、静态方法)都隐含了一个this引用,这个引用的类型为当前类,其指向的是调用方法的当前对象。this的使用方法与普通引用的使用是相同的。在类的方法中可以自由使用这个引用来访问当前对象的数据成员,或针对当前对象来调用方法。 .int area()int a=this.width* this.height;return a;.Rectangle r=new Rectangle(2,3);int d = r.area(); /隐含效果Rectangle.area( r );39this的使用返回当前对象自己区分同名数据成员与形参 在构造方法中使用构造方法class Aint x;void f(int
16、x)this.x=x;class Rectangleint width;int height;Rectangle(int w,int h) width=w;width=h;Rectangle()this(1,1); /调用第一个构造方法403.7 引用类型理解与应用基本类型:变量声明的同时创建了特定类型的数据(进行了内存分配)引用类型:所有其他类型都为引用类型(类,数组,接口),其特点为:进行变量声明的时候只创建引用变量,而不创建具体对象。具体对象需要用new创建(分配内存)引用与对象分离,其对应关系不固定,可以变化。这样就有可能产生一些前面讲基本类型时没有遇到过的问题:(1)一个引用先后指向
17、不同的对象的情况。(2)多个引用指向同一个对象的情况。413.7.1 理解引用类型引用支持的运算赋值=,!=1、赋值运算(1)被new创建的对象赋值。(表示:引用指向了一个对象)(2)被同类型的引用变量赋值。(注意:这会引起两个引用指向同一个对象)(3)被赋值以null。(表示引用不再指向任何对象)42class Rectangleint width;int height;Rectangle(int width,int height) this.width=width; this.height=height;void set(int width,int height) this.width=w
18、idth; this.height=height;void display( )System.out.println(矩形宽为+width+,高为+height); public class Testpublic static void main(String args).43Rectangle 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.display();/错误1234a
19、b1234ab56ab一个对象如没有任何引用指向它,对象就是无用的,无用的内存由Java垃圾收集机制回收。当对象使用完毕时,可以将引用变量赋值为nullnullnullab56442、比较运算中的=,!=两个引用变量可以进行相等与不等的比较,其比较的是引用的值,而不是引用所指向的对象是否相等引用变量可以与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)System.o
20、ut.println(“相等2”);a=null;a.display();/错误if (a!=null)a.display();453.7.2 方法参数传递参数传递方式按值传递:Java的基本类型数据采用这种传递方式。其特点是,实参将其值传递给形参,形参是实参的一个本地拷贝,对形参的操作对实参没有影响。 按引用传递:Java的引用类型的对象都采用这种传递方式。其特点是:参数传递时,实际传递的是对象的引用,而不是对象本身。形参是“实参引用”的一个本地拷贝,这样形参会指向实参对象,通过形参引用对对象的操作会作用到实际的实参对象上。 46【例3-4】按值传递对实参的影响class Avoid par
21、ameterChangeTest ( int n) n = 10;public class Testpublic 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 Avoid parameterChangeTest ( B n) n.i = 10;class Bint i;public class Testpublic static void
22、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 Avoid parameterChangeTest ( B n) n = new B();n.i = 10;class Bint i;public class Testpublic static void main(String args)A a = new A();B b =
23、 new B();b.i=100;a. parameterChangeTest ( b);System.out.println (b.i);对形参引用的重新赋值对实参并没有影响。 49引用类型做参数应用class Rectangleint width;int height;Rectangle()width=0;height=0;Rectangle(int w,int h)width=w; height=h;Rectangle(Rectangle r) width=r.width; height=r.height;void set(int width,int height) this.width
24、=width;this.height=height;void set(Rectangle r) width=r.width;height=r.height;50boolean equals(Rectangle r) return (width=r.width)&(height=r.height); void display()System.out.println(矩形宽为+width+,高为+height);public class Testpublic static void main(String args)Rectangle a=new Rectangle();Rectangle b=n
25、ew Rectangle(3,5);Rectangle c=new Rectangle(b);System.out.println(b=c);System.out.println( b.equals(c) );513.7.3 返回值为引用类型方法的返回值也可以为引用类型。当需要返回对象时,返回的实际是对象的引用,而不是对象本身。当将这个返回的引用赋值给某个声明的引用变量时,这个引用变量会指向这个返回值(引用)指向的对象。 52【例3-8】引用类型做返回值(返回当前对象)class Rectangleint width;int height;Rectangle(int w,int h)width
26、=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*s;return this;53Rectangle scale(int s,char type) if(type=w)width=width*s;else if(type=h)height=height*s;return th
27、is;public class Testpublic 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)b.display(); /语句(c)54【例3-9】引用类型做返回值(返回新对象)class Rectangleint width;int height;Rectangle(int w,int h)width=w; height=h;void displa
28、y()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) 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;5
29、5public class Testpublic static void main(String args)Rectangle a=new Rectangle(3,5);a.display();Rectangle b=a.scale(3);b.display();a.display();563.7.4 类的数据成员为引用类型一个类的数据成员可以为基本类型,也可以为引用类型(如类的数据成员类型可以为已定义的其它类)。这使我们不必从头定义一个类,而是可以使用已定义的其他类来描述类的数据成员,使类的定义更加方便。 57class Rectangle/此类与前面定义相同,这里省略class WallP
30、aintRectangle wall;double unitPrice;WallPaint()wall=new Rectangle(0,0); unitPrice=0;WallPaint(int w, int h, double p) wall = new Rectangle(w,h); unitPrice=p;void setUnitPrice(double p) unitPrice=p;void changeWall(int w, int h) wall.set(w,h); /修改矩形对象58double computePay()return unitPrice* wall.area();
31、 void display()System.out.print(墙体彩绘业务:n墙体);wall.display();System.out.println(此笔业务单价+unitPrice);public class Testpublic static void main(String args)WallPaint w=new WallPaint(2,3,125);w.display();System.out.println(总价格为:+wputePay() );593.8 作用域与生存期作用域:标识符的使用范围生存期:运行时,标识符的存在区间603.8.1 作用域局部域:方法体内定义的标识符
32、(补充2.6)(1)方法的形参作用域为整个方法,其在方法调用时通过参数传递初始化。(2)异常处理参数作用域为其后跟的表示的语句块,其在异常参数传递时初始化。类域:在类体中(方法外)定义的标识符为类的数据成员和成员方法,其作用域为类域。(1)类的数据成员和成员方法标识符的作用域以类为单位,在整个类内有效(允许类的所有成员方法直接访问)。(2)类的数据成员互相不能同名,类的成员方法也互相不能同名(因为在同一作用域)。(3)成员方法的局部变量可以与类的数据成员同名,但该类的数据成员在方法体内被暂时屏蔽。但可以通过this引用来访问该类的被屏蔽的数据成员。61【例3-12】局部引用变量与对象class
33、 A int i;A(int i1)i=i1;void display()System.out.println(i);public class Testpublic static void main(String args)A a;A b=new A(10);b.display();a=b;a.display();623.8.2 生命期1、局部变量生命期局部变量的生命期与其作用域有关。其在程序执行流程中,当到达作用域时变量开始使用,生命期开始,超出作用域则不再使用,生命期结束。 内存栈区2、数据成员生命期与对象生命期数据成员生命期:数据成员随对象创建而分配内存,随对象销毁而销毁,其生命期与对象
34、生命期一致。对象生命期:new创建时生命期开始,没有引用指向时生命期结束。内存堆区:垃圾收集机制63class Rectangle/内容略class ARectangle r;void set(Rectangle re)r = re;public class Testpublic 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);width:1height:1r1rbRectangle对象rc类A对象堆区栈区643.9 静态
35、数据成员与静态方法实例数据成员,实例方法类数据成员,类方法(静态数据成员,静态方法)653.9.1 静态数据成员类的静态数据成员概念数据成员属于类,而不属于任何特定的对象,由类的所有对象共享。类:Student属性:学号,姓名,成绩学生数方法:显示学生信息对象:aaa“001”,“aaa”,89对象:bbb“002”,“bbb”,78661、类的静态数据成员声明用static修饰符修饰类的数据成员2、类的静态数据成员访问类静态数据成员可通过类名直接访问,也可以通过对象访问,在类的方法中直接访问。注意:类的静态数据成员值被所有对象共享,任何对象都可以访问类的静态数据成员,但要注意,它们使用的是同
36、一个数据,操作的是同一块内存。无论哪个对象修改了它,对其它对象来说,它也已经变了。 67【例3-14】类的静态数据成员访问class Astatic int i ;void change(int i1) i=i1;public class Testpublic 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.print
37、ln(A.i+,+a.i+,+b.i);683、静态数据成员的初始化默认初始值,声明时直接初始化,静态初始化器。静态初始化器:Java允许通过静态初始化器初始化静态数据成员。静态初始化器语法:class Astatic int i;static int j=10;static int k;static int m;static k=20;m=30;static ./静态数据成员初始化语句694、实例数据成员与静态数据成员的对比类静态数据成员与实例数据成员二者区别:(1)不管有多少类的实例,类的静态数据成员只有一份拷贝,即所有对象共享相同的静态数据成员;而每个实例对象都有自己的实例数据成员。 (
38、2)类的静态数据成员仅在类初次使用时创建、初始化以后不会再初始化了。而每当创建类的对象时都为实例数据成员分配存储空间,并初始化。(3)实例数据成员只能通过对象来访,而类静态数据成员既可以通过类名来访问,也可以通过对象来访问。 70【例3-15】实例数据成员与静态数据成员的对比class Astatic int i;int j;A()i=10; j=10;void add()i+; j+;void display() System.out.println(i=+i+,j=+j);public class Testpublic static void main(String args)A a=ne
39、w A();A b=new A();a.add();a.display();b.display();b.add();a.display();b.display();jjiab引用 对象 静态属性713.9.2 静态方法1、 静态方法定义在方法声明前用static修饰符修饰,则方法为静态方法。如:class Astatic void f ( ) 注意:类的静态方法,属于整个类,而不针对特定对象,因此不能操作与对象直接相关的内容:(1)不能访问类的实例数据成员,不能调用类的实例方法。(2)静态方法没有this引用,因为this代表当前对象,而静态方法并不与特定对象产生联系。(3)静态方法可以做的是
40、:访问类的静态数据成员,调用类的静态方法。当然除此以外可以定义方法内的局部变量,也可以声明并操作方法的参数。722、静态方法的调用静态方法可以通过类名调用,也允许通过对象调用,也可以被类的其他方法直接调用。3、静态方法的应用静态方法的一个重要特点就是不用创建对象就可以调用。这是一个至关重要的用途,有时候类中会有一些方法需要在没有对象时也能使用。如:应用程序执行的入口点main方法必须是静态的。因为在其执行时,还没有任何对象被创建出来。静态方法常用于描述一些通用的算法。静态方法也常用于访问静态数据成员。73【例3-16】静态方法class Aint i=100;static void f()Sy
41、stem.out.println(hello);void display() System.out.println(i); f();public class Testpublic static void main(String args)A.f();A a=new A();a.f();a.display();74【例3-17】返回两个整数的较大值的静态方法public class Teststatic int max(int a,int b) if ( a b )return a;elsereturn b; public static void main(String args ) int a
42、=10,b=12,c=3,max;max=max(a,b);max=max(max,c);System.out.println(max);75class Countint i=0;static int counter=0;static void add( )counter+;static void display( )System.out.println(counter);void addi( )i+;void displayi( )System.out.println(i);public class Testpublic static void main(String args )Count
43、.display( );Count.add( );Count.display( );Count a=new Count( );a.add( );a.display( );a.addi( );a.displayi( );Count b=new Count( );b.add( );b.display( );b.addi( );b.displayi( );a.display( );763.10 final 修饰符Java提供了final修饰符,final表示最终的。这个修饰符可以用来修饰局部变量数据成员类方法771. final修饰局部变量终态局部变量,其特点是初始化其值以后就不能再修改其值,相当于标识符常量 public class Testpublic static void main(String args )final int i;i=10;i=11; /错782. final修饰类的数据成员终态数据成员,其值在程序执行期间不能改变。final数据成员必须在声明变量时,或在构造方法中初始化,以后在任何其他地方不能再修改它的值。79class Tfinal int n = 10;final int m;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度股权投资合同:甲方投资乙方公司的投资金额、股权比例等3篇
- 二零二五年度车辆包车保险合同规范3篇
- 二零二五版地下综合管廊安全防护质量保修合同3篇
- 二零二五版30万吨矿砂船船舶维修保养及配件供应长期合同3篇
- 二零二五版专业环保印刷保密合同3篇
- 二零二五年度网络直播平台运营与分成合同2篇
- 二零二五年环保搬运承包项目合同3篇
- 解除2025年度互联网金融服务合同3篇
- 二零二五版文化衍生品开发及销售合同范本3篇
- 二零二五版服装品牌管理公司员工劳动合同范本3篇
- 2025年中国高纯生铁行业政策、市场规模及投资前景研究报告(智研咨询发布)
- 2022-2024年浙江中考英语试题汇编:完形填空(学生版)
- 2025年广东省广州市荔湾区各街道办事处招聘90人历年高频重点提升(共500题)附带答案详解
- 中试部培训资料
- 硝化棉是天然纤维素硝化棉制造行业分析报告
- 央视网2025亚冬会营销方案
- 北师大版数学三年级下册竖式计算题100道
- 计算机网络技术全套教学课件
- 屋顶分布式光伏发电项目施工重点难点分析及应对措施
- 胃镜下超声穿刺护理配合
- 2024解析:第三章物态变化-基础练(原卷版)
评论
0/150
提交评论