《02_Java的面向对象编程.ppt》由会员分享,可在线阅读,更多相关《02_Java的面向对象编程.ppt(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java的的面向对象编程面向对象编程面向对象编程概述面向对象编程概述n n简单的说,面向对象编程(简单的说,面向对象编程(Object Oriented Object Oriented ProgrammingProgramming,简称简称OOPOOP)描述的是对象之间的相描述的是对象之间的相互作用。互作用。n n面向对象编程与面向过程编程的区别:面向对象编程与面向过程编程的区别:过过程程化化程程序序设设计计先先确确定定算算法法,再再确确定定数数据据结结构构;面向对象编程先确定数据结构,再确定运算。面向对象编程先确定数据结构,再确定运算。面面向向过过程程编编程程的的程程序序员员,习习惯惯于于建
2、建立立数数据据结结构构存存放放数数据据并并定定义义方方法法(函函数数)来来操操作作数数据据;面面向向对对象象编编程程的的程程序序员员则则构构造造一一个个对对象象模模型型,将将数数据据与与方方法法组组织织在一起。在一起。对象对象 对象的状态对象的状态 对象的行为对象的行为n n我们可以把现实世界的事物抽象成对象。我们可以把现实世界的事物抽象成对象。n n对象一般都有两个特征:状态(对象一般都有两个特征:状态(state)和和行为(行为(behavior)。)。n n软件的对象概念是由现实世界对象抽象而软件的对象概念是由现实世界对象抽象而来来。把现实世界对象的状态保存在软件对象的变量中;现实世界对
3、象的行为通过软件对象的方法(函数)来实现。类和类和对象对象n n把相似的对象划归成一个类。n n在软件中,类,就是一个模板,它定义了通用于一个特定种类的所有对象的状态(变量)和行为(方法)。n n类是创建对象的模板,对象是类的实例。什么是类什么是类n n什么是类?n n类是描述对象的“基本原型”,它定义一种对象所能拥有的数据和能完成的操作,在面向对象的程序设计中,类是程序的基本单元。n n组成类的元素:变量,方法,消息一个列子一个列子:什么是类什么是类nclass Hello/类名类名n nPublic String s;/变量变量npublic void showString()/方法方法n
4、 System.out.println(s);npublic void changeString(String str)/有参数的方有参数的方法法n s=str;return s;n变量,方法,消息变量,方法,消息n n变量:即指对象的所知道的状态n n方法:指对象的功能单元。n n消息:软件对象通过相互间传递消息来相互 作用和通信n n组成消息的三个部分:n n1.接受消息的对象n n2.要完成方法的名字n n3.方法需要的参数面向对象程序设计面向对象程序设计n n从程序设计的角度看,类是面向对象程序中最基本的程序单元。类实质上定义的是一种数据类型,这种数据类型就是对象类型。所以我们可以使用
5、类名称来声明对象变量。n n声明对象变量之后,还不能使用对象。必须用运算符new创建对象实体之后,才能使用对象。面向对象编程的难点面向对象编程的难点n n掌握面向对象的困难之处在于思路的转换。我们通常习惯于考虑解决问题的方法,我们通常习惯于考虑解决问题的方法,而不是考虑将问题抽象成对象再去解决它。而不是考虑将问题抽象成对象再去解决它。一个简单的例子一个简单的例子n n编写一个驾驶汽车的方法编写一个驾驶汽车的方法面向过程的程序设计:编写一个方法,void drivecar();面向对象的程序设计:将一辆汽车看成一个对象,将所有汽车对象的共性抽取出来,设计一个类Car,类中有一个方法void dr
6、ive(),用Car这个类实例化一个具体的对象car,调用:car.drive()。一个简单的例子一个简单的例子nclass Car nnPublic String car_color;n nPublic void Public void drivecardrivecar()/()/方法方法n n n nCar_colorCar_color=“red”;=“red”;n n n nPublic static void Public static void main(Stringmain(String argsargs)n n n nCar Car aaaaaa=new Car();/=new
7、Car();/用用用用CarCar这个类实例化一个具体的对这个类实例化一个具体的对这个类实例化一个具体的对这个类实例化一个具体的对象象象象aaaaaan nAaaAaa.DrivecarDrivecar();/();/调用:调用:调用:调用:Aaa.driveAaa.drive()()n n n n 类的构造方法类的构造方法n n构造方法的名字和类名相同,并且没有返回值。n n构造方法主要用于为类的对象定义初始化状态。n n我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例。n nJava的类都要求有构造方法,如果没有定义构造方法,Java编译器会为我们提供一个缺省的构
8、造方法,也就是不带参数的构造方法。一个例子一个例子:类的构造方法类的构造方法nclass Car nn ncar()/car()/构造构造构造构造方法方法n n n nCar_colorCar_color=“red”;=“red”;n nSystem.out.print(car_colorSystem.out.print(car_color););n n n nPublic static void Public static void main(Stringmain(String argsargs)n n n nCar Car aaaaaa=new Car();/=new Car();/用用用
9、用CarCar这个类实例化一个具这个类实例化一个具这个类实例化一个具这个类实例化一个具体的对象体的对象体的对象体的对象aaaaaan n n n new关键字的作用关键字的作用n n为对象分配内存空间。为对象分配内存空间。n n引起对象构造方法的调用。引起对象构造方法的调用。n n为对象返回一个引用。为对象返回一个引用。n nCar car=new Car();/用用Car这个类实例化这个类实例化一个具体的对象一个具体的对象car 缺省构造方法缺省构造方法n n当我们用缺省的构造方法初始化对象当我们用缺省的构造方法初始化对象时,系统用默认值初始化对象的成员时,系统用默认值初始化对象的成员变量。
10、变量。n n各种数据类型的默认值为:各种数据类型的默认值为:数值型0booleanfalsechar0对象null方法的重载方法的重载(overload)重载构成的条件:方法的名称相同,但参数类型或参数个数不同,才能构成方法的重载。class Test void receive(int i)void receive(int x,int y)void receive(double d)void receive(String s)一个例子一个例子:方法的重载方法的重载nclass Testnpublic void receive(String i)/方法方法(1)nnSystem.out.prin
11、t(i);nnPublic void receive(int x,int y)/方法方法(2)nnSystem.out.print(x,y);n Public void receive(int x,int y,int z)/方法方法(3)nnSystem.out.print(x,y,z);nZ=x+y;nSystem.out.print(z);nn特殊变量特殊变量thisn nthis变量代表对象本身变量代表对象本身n n当类中有两个同名变量,一个属于类(类当类中有两个同名变量,一个属于类(类的成员变量),而另一个属于某个特定的的成员变量),而另一个属于某个特定的方法(方法中的局部变量),使用
12、方法(方法中的局部变量),使用this区分区分成员变量和局部变量。成员变量和局部变量。n n使用使用this简化构造函数的调用。简化构造函数的调用。一个例子一个例子:特殊变量特殊变量thisnclass TestnPublic String color;npublic void receive(String a)/方法方法nnColor=“black”;nSystem.out.print(Color);nThis.color=a;/使用使用特殊变量特殊变量特殊变量特殊变量thisthisnSystem.out.print(color);nn特殊变量特殊变量thisn n关于实例方法和实例数据成
13、员的进一步说明关于实例方法和实例数据成员的进一步说明关于实例方法和实例数据成员的进一步说明关于实例方法和实例数据成员的进一步说明 一个类所有的实例(对象)调用的成员方法在内一个类所有的实例(对象)调用的成员方法在内存中只有一份拷贝,尽管在内存中可能有多个对存中只有一份拷贝,尽管在内存中可能有多个对象,而数据成员在类的每个对象所在内存中都存象,而数据成员在类的每个对象所在内存中都存在着一份拷贝。在着一份拷贝。thisthis变量允许相同的实例方法为不变量允许相同的实例方法为不同的对象工作。同的对象工作。每当调用一个实例方法时,每当调用一个实例方法时,每当调用一个实例方法时,每当调用一个实例方法时
14、,thisthis变变变变量将被设置成引用该实例方法的特定的类对象。量将被设置成引用该实例方法的特定的类对象。量将被设置成引用该实例方法的特定的类对象。量将被设置成引用该实例方法的特定的类对象。方法的代码接着会与方法的代码接着会与方法的代码接着会与方法的代码接着会与thisthis所代表的对象的特定数据所代表的对象的特定数据所代表的对象的特定数据所代表的对象的特定数据建立关联。建立关联。建立关联。建立关联。关键字关键字static通常,类成员必须通过它的类的对象访问.但是,可以创建这样一个成员,它能够被它自己使用,而无需引用一个特殊的实例.要创建这样一个成员,在它的生命前面加上关键字STATI
15、C即可,当声明一个成员为STATIC时,可以在类的任何对象创建之前访问它,而无需引用任何对象.也可以将方法和变量都声明成为STATIC.STATIC成员的最常见的例子是MAIN()方法,因为在程序开始执行时必须调用MAIN().关键字关键字staticn n被声明为STATIC的变量本质上是全局变量.n n声明为STATIC的方法有几天限制:n n1,他们仅仅可以调用其他STATIC方法n n2,他们只能访问STATIC数据n n3,他们不能以任何方式引用THIS或SUPER一个例子一个例子:关键字关键字staticn nClass Class UserStaticUserStaticn n
16、n nStatic Static intint a=3;a=3;n nStatic Static intint b;b;n nStatic void Static void testStatic(inttestStatic(int x)x)n n n nSystem.out.print(xSystem.out.print(x););n nSystem.out.print(aSystem.out.print(a););n nSystem.out.print(bSystem.out.print(b););n n n nPublic static void Public static void ma
17、in(stringmain(string argsargs)n n n ntestStatic(42);testStatic(42);n n n n 常量的定义常量的定义n n使用关键字使用关键字final定义常量,例如:定义常量,例如:final double PI=3.1415926;n n作为一种约定,在定义常量时,通常采用作为一种约定,在定义常量时,通常采用大写形式。大写形式。n nfinal常量可以在声明的同时赋初值,也可以常量可以在声明的同时赋初值,也可以在构造函数中赋初值。在构造函数中赋初值。n n为了节省内存,我们通常将常量声明为静为了节省内存,我们通常将常量声明为静态的(态的
18、(static)。)。一个例子一个例子:常量常量n nClass Class TestFinalTestFinaln n n nPublic Final Public Final intint AAA=3;/AAA=3;/常量常量n nPublic Final String BBB=“Public Final String BBB=“常量常量常量常量”;/;/常量常量n nStatic void Static void testFinaltestFinal()()n n n nSystem.out.print(AAASystem.out.print(AAA););n nSystem.out.p
19、rint(BBBSystem.out.print(BBB););n n n nPublic static void Public static void main(stringmain(string argsargs)n n n ntestFinaltestFinal();();n n n n 一个例子一个例子:常量常量n n理解继承是理解面向对象程序设计的关键。理解继承是理解面向对象程序设计的关键。n n在在JavaJava中,通过关键字中,通过关键字extendsextends继承一个已有的类,继承一个已有的类,被继承的类称为父类(超类,基类),新的类称被继承的类称为父类(超类,基类),新
20、的类称为子类(派生类)。为子类(派生类)。n n在在JavaJava中,不允许多继承。中,不允许多继承。class Car int color_number;int door_number;int speed;push_break()add_oil()class Trash_Car extends Car double amount;fill_trash()方法的覆盖(方法的覆盖(override)n n在子类中定义一个与父类同名、返回类型、参数在子类中定义一个与父类同名、返回类型、参数类型均相同一个方法,称为方法的覆盖。类型均相同一个方法,称为方法的覆盖。n n覆盖发生在子类与父类之间。覆盖
21、发生在子类与父类之间。class Car int color_number;int door_number;int speed;push_break()speed=0;add_oil()class Trash_Car extends Car double amount;fill_trash()push_break()speed=speed-10;一个例子一个例子:方法的覆盖方法的覆盖nclass Car n int color_number;n int door_number;n int speed;n n push_break()n speed=0;n add_oil()n class Tr
22、ash_Car extends Car double amount;fill_trash()push_break()speed=speed-10;特殊变量特殊变量supern n特殊变量特殊变量super,提供了对父类的访问。提供了对父类的访问。n n可以使用可以使用super访问父类被子类隐藏的变量访问父类被子类隐藏的变量或覆盖的方法。或覆盖的方法。n n每个子类构造方法的第一条语句,都是隐每个子类构造方法的第一条语句,都是隐含地调用含地调用super(),如果父类没有这种形式如果父类没有这种形式的构造函数,那么在编译的时候就会报错。的构造函数,那么在编译的时候就会报错。特殊变量特殊变量su
23、pern nsuper有两种通用形式。第一种调用超类的构造函数。第二种用来访问被子类的成员隐 藏的超类成员 一个例子一个例子:特殊变量特殊变量supern nclass class BoxWeightBoxWeight extends Box extends Box n ndouble weight;double weight;n nsuper()super()BoxWeight(doubleBoxWeight(double w,double h,double d,w,double h,double d,double m)double m)n n n n super(wsuper(w,h,d)
24、;,h,d);n nweight=m;weight=m;n n n n 多态性多态性 n n通过覆盖父类的方法来实现,在运行时根据传递的对象引用,来调用相应的方法。void show(int int_num)void show(double double_num)void show(nit nit_ um,float float_um)1231.23123,1.23类类一个例子一个例子:多态性多态性 nclass Testnpublic void receive(String i)/方法方法(1)nnSystem.out.print(i);nnPublic void receive(int x
25、,int y)/方法方法(2)nnSystem.out.print(x,y);n Public void receive(int x,int y,int z)/方法方法(3)nnSystem.out.print(x,y,z);nZ=x+y;nSystem.out.print(z);nn抽象类抽象类n n有些情况下,你希望定义一个超类,该超类定义了一种给定结构的抽象但是不提供任 何完整的方法实现。也就是说,有时你希望创建一个只定义一个被它的所有子类共享的通 用形式,由每个子类自己去填写细节。这样的类决定了子类所必须实现的方法的本性。这 类情形下一种可能发生的情况是超类不能创建一个方法的有意义的实
26、现。抽象类抽象类n n你可以通过指定abstract类型修饰符由子类重载某些方法。这些方法有时被作为子类责 任(subclasser responsibility)引用,因为它们没有在超类中指定的实现。这样子类必须重 载它们它们不能简单地使用超类中定义的版本。声明一个抽象方法,用下面的通用形 式:n nabstract type name(parameter-list);一个例子一个例子:抽象类抽象类n nabstract class A n n abstract void callme();n nvoid callmetoo()n nSystem.out.println(This is a
27、concrete method.);n n n n一个例子一个例子:抽象类抽象类n nclass B extends A class B extends A n n void void callmecallme()()n n System.out.println(BsSystem.out.println(Bs implementation of implementation of callmecallme.);.);n n n nclass class AbstractDemoAbstractDemo n npublic static void public static void main(
28、Stringmain(String argsargs)n nB b=new B();B b=new B();n n b.callmeb.callme();();n n b.callmetoob.callmetoo();();n n n n n n注意程序中声明A的对象。刚刚讲过,实例化一个抽象类是不可能的。另外一点要注 意:类A实现一个具体的方法callmetoo()。这是完全可接受的,抽象类可以包括它们合适的 很多实现。Object类类n n有一种由Java定义的特殊的类Object。所有其他的类都是Object的子类。也就是说,Object是所有其他类的超类。这意味着一个Object类型的
29、引用变量可以引用其他任何一个类 的对象。同样,因为数组像类一样执行,Object类型变量可以引用任何数组。Object 类定义的方法及其用途类定义的方法及其用途n nObject clone()Object clone()创建一个和被复制的对象完全一样的新创建一个和被复制的对象完全一样的新创建一个和被复制的对象完全一样的新创建一个和被复制的对象完全一样的新对象对象对象对象n nbooleanboolean equals(Objectequals(Object object)object)判定对象是否相等判定对象是否相等判定对象是否相等判定对象是否相等n nvoid finalize()void
30、 finalize()在一个不常用的对象被使用前调用在一个不常用的对象被使用前调用在一个不常用的对象被使用前调用在一个不常用的对象被使用前调用n nClass Class getClassgetClass()()获取运行时一个对象的类获取运行时一个对象的类获取运行时一个对象的类获取运行时一个对象的类n nintint hashCodehashCode()()返回调用对象有关的散列值返回调用对象有关的散列值返回调用对象有关的散列值返回调用对象有关的散列值n nvoid notify()void notify()恢复一个等待调用对象线程的执行恢复一个等待调用对象线程的执行恢复一个等待调用对象线程的
31、执行恢复一个等待调用对象线程的执行n nvoid void notifyAllnotifyAll()()恢复所有等待调用对象线程的执行恢复所有等待调用对象线程的执行恢复所有等待调用对象线程的执行恢复所有等待调用对象线程的执行n nString String toStringtoString()()n nvoid wait()void wait()n nvoid void wait(longwait(long milliseconds)milliseconds)n nvoid void wait(longwait(long milliseconds,milliseconds,n n intint
32、 nanoseconds)nanoseconds)返回描述对象的一个字符串返回描述对象的一个字符串返回描述对象的一个字符串返回描述对象的一个字符串 等待另一个线程的执行等待另一个线程的执行等待另一个线程的执行等待另一个线程的执行n ngetClass(),notify(),notifyAll()和wait()方法被定义成final。你可以重载除这些方法 以外的其他方法。这些方法在本书的其他地方有所描述。然而,现在注意两个方法:equals()和toString()。equals()方法比较两个对象的内容。如果对象是相等的,它返回true,否则返 回false。toString()方法返回一个包含调用它的对象描述的字符串。而且,该方法在对象用 println()输出时自动调用。很多类重载该方法。这样做使它们生成它们创建对象类型的一个 特殊描述。