《面向对象特征 》PPT课件

上传人:新** 文档编号:580345639 上传时间:2024-08-28 格式:PPT 页数:157 大小:777.50KB
返回 下载 相关 举报
《面向对象特征 》PPT课件_第1页
第1页 / 共157页
《面向对象特征 》PPT课件_第2页
第2页 / 共157页
《面向对象特征 》PPT课件_第3页
第3页 / 共157页
《面向对象特征 》PPT课件_第4页
第4页 / 共157页
《面向对象特征 》PPT课件_第5页
第5页 / 共157页
点击查看更多>>
资源描述

《《面向对象特征 》PPT课件》由会员分享,可在线阅读,更多相关《《面向对象特征 》PPT课件(157页珍藏版)》请在金锄头文库上搜索。

1、面向对象程序设计(Java)武汉大学国际软件学院 桂浩1第三章面向对象特征1.基本概念2.类的定义3.对象4.类的继承和多态5.接口和包6.常用工具类2基本概念n什么是编程语言?n人和计算机进行交流的工具和手段n编程语言的发展n机器语言: 0101001n汇编语言: mov, push, add, calln第三代语言: 高级语言,以C语言为代表,过程式编程语言(Procedural Programming Language)n第四代语言: 非过程化/面向对象的编程语言n语言的发展: 抽象的过程3n面向对象(Object Oriented-OO) n面向对象编程(Object Oriented

2、 Programming-OOP)n面向对象是一种软件开发的方法,“面向对象的分析与设计”(OOA&OOD研究生课程)n第一个面向对象的语言: Simula-67n第一个成功的面向对象编程语言: SmalltalknC+, JAVA, C#, PERL等1.用客观世界中描述事物的方法来描述程序中要解决的问题2.万事万物都是对象3.程序便是成堆的对象,彼此通过消息的传递,请求其他对象进行工作 基本概念4n五个基本概念1.对象2.类3.封装性4.继承性5.多态性基本概念51.对象 (object)neverything is an objectn现实世界的对象: 桌子、书、自行车、电视、狗、文件、

3、表格、按钮、窗口n对象包含两个特性n状态: 指对象本身的信息(内部信息/内部变量)n行为: 实现对信息的访问/对象的操作n标志: 代表对象的标识符n山地车的状态(两个车轮、一些齿轮、速度、挡数),行为(刹车、加速、减速和换挡)n书包含很多信息,拥有访问所包含信息的方法,一页一页的看,通过目录找到感兴趣的内容基本概念61.对象 (object)n状态变量(variables)n行为方法(method)n对象就是变量和相关方法的软件集合n一个对象可以由其他对象组合而成,窗口(按钮,菜单条,文本框,状态栏等)n程序就是对象的集合,对象之间相互交互和通信完成任务n搭积木nA program is a

4、bunch of objects telling each other what to do by sending messages基本概念72.类 (class)n亚里士多德: the class of fishes and the class of birdsn现实世界中,存在很多同类的对象,很多桌子、书、自行车n一种原型,一种抽象,一种共性,一个模板nEvery object has a typen实例(instance),某类对象的一个特定实体,类是对象的一个抽象n表格(类) 填入不同的个人信息不同的对象基本概念83.封装性n对象本身的数据得到保护/隐藏n其他对象仅仅需要知道对该对象的

5、访问方法(接口/interface)即可n好处n模块化-每个对象的源文件可以是相互独立的,可以被不同的程序调用,每个对象是一块积木,可以搭建不同的形状n信息隐藏-通常定义一个公共接口/方法实现对对象的访问,可以调整对象的私有信息和方法,而不会对其他调用它的对象产生影响n可重用性n黑盒子n电脑的DIYn喷墨打印机,硒鼓坏/彩色硒鼓基本概念94.继承性n为什么会有继承?n建立一个类后,发现另一个新的类有相同的特性,两个选择:重新定义一个新的类;在已有类的基础上,修改(加加/减减)n父类和子类,子类继承(拥有)父类所有的数据和方法,同时子类可以有新的数据和方法,“青出于蓝,而胜于蓝”n树型结构(层次

6、化结构) n根(基类)基本概念104.继承性运输工具航空运输工具陆地运输工具水上运输工具人力驱动引擎驱动二轮四轮客运货运基本概念114.继承性n多重继承类A类B类C类D类F类Gn一个类拥有多个父类产生二义性,例类C和类D都有一个同名的方法,类G?nJava中仅仅支持单一继承,同时Java采用Interface(接口)实现多重继承而避免父类二义性基本概念125.多态性n表现在继承中方法的重写n子类从父类继承(extends扩展)而来n多个子类同属一个父类,所有子类有相同的父类n继承父类的方法n在不同的子类中有不同的表现形式n表现在用一个类中方法的重载基本概念135.多态性n多态性在继承中的表现基

7、本概念145.多态性classSquareextendsShapevoiddraw()System.out.println(Square.draw();voiderase()System.out.println(Square.erase()“);classTriangleextendsShapevoiddraw()System.out.println(Triangle.draw();voiderase()System.out.println(Triangle.erase();classShapevoiddraw()voiderase()classCircleextendsShapevoiddr

8、aw()System.out.println(Circle.draw();voiderase()System.out.println(Circle.erase();基本概念155.多态性publicclassTestpublicstaticShaperandShape()switch(int)(Math.random()*3)default:case0:returnnewCircle();case1:returnnewSquare();case2:returnnewTriangle();publicstaticvoidmain(Stringargs)Shapes=newShape9;for(i

9、nti=0;is.length;i+)si=randShape();for(inti=0;ijavacA.javaxhasprivateaccessinAa.x=100;print()hasprivateaccessinAa.print();2errors类成员的访问classAprivateintx;privatevoidprint()classBvoidtest()Aa=newA();a.x=100;a.print();31nprotected (保护变量/保护方法)n容许类本身、子类(有一定限制)以及同一个包中所有类访问(先构造对象,再访问)类成员的访问classAprotectedin

10、tx;protectedvoidprint()classBvoidtest()Aa=newA();a.x=100;a.print();packageabc;classAprotectedintx;protectedvoidprint()packagexyz;importabc.A;classBextendsAvoidtest(Aa,Bb)a.x=100;a.print();b.x=100;b.print();/illegal/illegal/legal/legal32n无修饰 (友好变量/友好方法)n容许类本身以及同一个包中所有类访问类成员的访问classAintx;voidprint()cl

11、assBvoidtest()Aa=newA();a.x=100;a.print();packageabc;classAintx;voidprint()packageabc;classBvoidtest()Aa=newA();a.x=100;a.print();33n小结名称访问权修饰符类本身子类包所有类公共public默认-保护protected *私有private*指子类与父类不在同一个包中的情况类成员变量的访问34nstatic (静态变量/静态方法)n类的变量/方法,独立于类的对象,可以直接根据类名调用classSstaticintA=12,B=34;staticvoidprint()

12、classTestpublicstaticvoidmain(Stringargs)System.out.println(“A=“+S.A+“B=“+S.B);S.print();类成员变量35nstatic (静态变量/静态方法)classTestpublicvoidprint(intx)System.out.println(x);publicstaticvoidmain(Stringargs)intx=3;print(x);D:javacTest.javaTest.java:9:non-staticmethodprint(int)cannotbereferencedfromastaticco

13、ntextprint(x);1errorclassTestpublicvoidprint(intx)System.out.println(x);publicstaticvoidmain(Stringargs)intx=3;Testt=newTest();t.print(x);classTestpublicstaticvoidprint(intx)System.out.println(x);publicstaticvoidmain(Stringargs)intx=3;print(x);static方法中仅仅可以调用其他static方法类成员36nfinal 变量/方法nfinal变量: 定义一个

14、常数,即变量值不能改变final double AVOGADRO = 6.022e23;nfinal类: 不能有子类nfinal方法: 方法不能被重写(overriding)classChessAlgorithm.finalvoidnextMove(ChessPiecepieceMoved,BoardLocationnewLocation).类成员变量37n小结n类: public, abstract, final, 无修饰, privaten类成员npublicnprotectednprivaten无修饰nstaticnfinal类成员变量38n方法: 对象行为的描述n完成某种功能的程序块n

15、定义: 访问权限修饰符 方法返回类型 方法名 () throws 异常名 方法体;n方法参数的传递n变量的作用域n方法的重载(overloading)/重写(overriding)n方法的递归调用类成员方法39n访问控制修饰符n公共访问控制符public n被所有类访问n默认访问控制符n被同一包中其他类访问n私有访问控制符 privaten被该类自身访问n保护访问控制符 protectedn该类自身、同一个包中的其他类、其他包中的子类访问n私有保护访问控制符private protectedn该类自身、所有子类访问类成员方法的访问40n非访问控制修符n静态方法staticn属于类的方法n最终方

16、法finaln不能被子类重新定义的方法n抽象方法abstractn只有方法说明,没有具体实现n本地方法nativen以其他语言实现方法功能n同步方法synchronizedn用于多线程程序中的协调和同步类成员方法的访问41n例成员方法classTestpublicstaticvoidmain(Stringargs)doubled_product;AreamyArea;myArea=newArea();d_product=myArea.product();System.out.println(“myArea的面积是:”+d_product);classAreadoublewidth,height

17、;voidsetV(doublew,doubleh)width=w;height=h;doubleproduct()returnwidth*height;42n方法参数成员方法publicstaticvoidmain(Stringargs)intx=3,y=4;Testp=newTest();System.out.println(x+y);p.addI(x,y);System.out.println(x+y);Vectorc=newVector();c.addElement(s1);c.addElement(s2);System.out.println(c.size();p.addV(c);S

18、ystem.out.println(c.size();importjava.util.Vector;classTestprivatevoidaddV(Vectorv)v.addElement(s3);privatevoidaddI(inti1,inti2)i1+;i2+;形参和实参D:javaParameter343423注意1:类型匹配注意2:基本类型与复合类型参数传递的结果不同Pass by ValueInJavamethods,argumentsarepassed by value.Wheninvoked,themethodreceivesthevalueofthevariablepas

19、sedin.Whentheargumentisofprimitivetype,pass-by-valuemeansthatthemethodcannotchangeitsvalue.Whentheargumentisofreferencetype,pass-by-valuemeansthatthemethodcannotchangetheobjectreference,butcaninvoketheobjectsmethodsandmodifytheaccessiblevariableswithintheobject.43n例成员方法classTestpublicstaticvoidmain(

20、Stringargs)exA=newex();A.p();classexintu,v;voidp2(intx,inty)inti,j;for(i=1;i=x;i+)j=y+i;System.out.print(j+“”);voidp()u=3;v=2;p2(u,v);System.out.println();u+=v;v*=u;p2(u,v);u=3;v=2;u=5;v=10;输出结果:345111213141544n变量的作用域(成员变量/局部变量)成员方法45n方法的重载(overload)n方法名相同,但方法的参数不同方法描述 方法名(标识符) 参数类型 方法返回值 绝对值 abs(a)

21、 int int绝对值 abs(a) long long绝对值 abs(a) float float绝对值 abs(a) double double public static int abs(inta) public static long abs(longa) public static float abs(floata)public static double abs(doublea) 成员方法46n方法的重写(overriding)n子类重写父类的方法成员方法classFathervoiddisplay() ;classSonextendsFathervoiddisplay();Fat

22、herf=newFather();f.display();Sons=newSon();s.display();47构造方法n创建对象/实例化对象new 例1: Apple a = new Apple(); (创建对象)例2: Apple a; (对象的说明) a = new Apple(); (实例化对象)1.对象的实例化通过构造方法(constructor)来实现2.构造方法的名字与类名相同3.构造方法没有返回值4.构造方法可以有多个,构成方法的重载(overload)48n例: 对象的实例化和初始化classjex6_8publicstaticvoidmain(Stringargs)Qan

23、gleq1=newQangle();Qangleq2=newQangle(20,50);Qangleq3=newQangle(q1);System.out.println(q1.width()+“”+q1.height();System.out.println(q2.width()+“”+q2.height();System.out.println(q3.width()+“”+q3.height();classQangleinta,h;Qangle()a=10;h=20;Qangle(intx,inty)a=x;h=y;Qangle(Qangler)a=r.width();h=r.height

24、();intwidth()returna;intheight()returnh;输出结果:1020112050121020构造方法49n再谈方法的重载(overload)构造方法classTreeintheight;Tree()prt(“Plantingaseeding”);height=0;Tree(inti)prt(“CreatingnewTreethatis”+i+“feettall”);height=i;voidinfo()prt(“Treeis”+height+“feetheight”);voidinfo(Strings)prt(s+“:Treeis”+height+“feethei

25、ght”);staticvoidprt(Strings)System.out.println(s);for(inti=0;i5;i+)Treet=newTree(i);t.info();t.info(“mytree”);newTree();50n默认构造方法例 class Apple int color; Apple a = new Apple();n对象实例的判断: null例 Apple a; if (a = null) System.out.println(“Day dream”);构造方法运行时系统自动赋予一个空构造函数如Apple()51n再谈构造方法构造方法classCmethod

26、Cmethod(booleanb)publicstaticvoidmain(Stringargs)Cmethodc1=newCmethod();Cmethodc2=newCmethod(false);classCmethodCmethod(booleanb)publicstaticvoidmain(Stringargs)/Cmethodc1=newCmethod();Cmethodc2=newCmethod(false);classCmethodCmethod(booleanb)Cmethod()publicstaticvoidmain(Stringargs)Cmethodc1=newCmet

27、hod();Cmethodc2=newCmethod(false);运行时系统自动赋予一个空构造方法,仅仅当该类没定义构造方法的情况下52static变量的初始化classSmemberstaticinti=100;staticbooleanb=true;charc=t;publicSmember()publicstaticvoidmain(Stringargs)Smemberm1=newSmember();Smemberm2=newSmember();不论产生多少个对象,属于类的静态变量只有一份,即只占有一份存储空间classSmemberstaticinti;staticbooleanb;

28、statici=100;b=true;System.out.println(“Instaticblock”);charc=t;publicSmember()System.out.println(“Inconstructor”);publicstaticvoidmain(Stringargs)Smemberm1=newSmember();Smemberm2=newSmember();输出结果InstaticblockInconstructorInconstructor53设计模式的例子classSingletonprivatestaticSingletonme=newSingleton();pu

29、blicstaticSingletongetSingleton()returnme;privateSingleton()publicstaticvoidmain(Stringargs)Singletons1=Singleton.getSingleton();Singletons2=Singleton.getSingleton();if(s1=s2)System.out.println(s1iss2);elseSystem.out.println(s1isnots2);该Singleton类只有一个实例,即该Singleton类只能构造一个对象54“DesignPatterns:Elements

30、ofReusableObject-OrientedSoftware”(设计模式)nErichGamma、RichardHelm、RalphJohnson、JohnVlissidesAddison-Wesley,1995n这几位作者常被称为“四人组(GangofFour)”,而这本书也就被称为“四人组(或GoF)”书n设计模式:在一定的环境中解决某一问题的方案n23种设计模式,3大类n创建型模式(Creational pattern)规定了创建对象的方式,如Singleton模式、FactoryMethod模式n结构型模式(Structuralpattern)规定了如何组织类和对象。这些模式涉及

31、类如何相互继承或如何从其它类组合,如Adapter、Proxy和Decorator模式n行为模式(Behavioralpattern)规定了对象之间交互的方式。如Observer模式、Strategy和Template模式n并发模式(Concurrencypattern)规定协调或顺序对共享资源访问的方式nMVC(Model/View/Controller,模型/视图/控制器)55设计模式的例子publicclassSequenceprivatestaticSequenceinstance;privatestaticintcounter;privateSequence()counter=0;p

32、ublicstaticsynchronizedSequencegetInstance()if(instance=null)instance=newSequence();returninstance;publicstaticsynchronizedintgetNext()return+counter;n这个类不可以再有子类,因为构造方法是privatenLazyinstantiation(Lazyinitialization),仅在需要的时候才实例化对象privatestaticSequenceinstance=newSequence();56抽象类(abstractclass)n一个未完成的类

33、n仅仅抽象类可以包含抽象方法(abstract methods)n抽象方法: 仅仅申明了方法,但未实现n有访问修饰词n返回值类型n方法名n参数列表n无方法体57抽象类(abstractclass)abstractclassPointintx=1,y=1;voidmove(intdx,intdy)x+=dx;y+=dy;alert();abstractvoidalert();abstractclassColoredPointextendsPointintcolor;classSimplePointextendsPointvoidalert()抽象方法:有访问修饰词、返回值类型、方法名和参数列表,

34、无方法体58抽象类(abstractclass)n抽象类不能被实例化,例Point p = new Point(); n子类继承抽象类时,必须重写抽象方法,否则仍为抽象类abstractclassPointintx=1,y=1;voidmove(intdx,intdy)x+=dx;y+=dy;alert();abstractvoidalert();abstractclassColoredPointextendsPointintcolor;classSimplePointextendsPointvoidalert()Pointp=newSimplePoint();59抽象类(abstractcl

35、ass)n多态性abstractclassGraphicsabstractvoidparameter();abstractvoidarea();classRectangleextendsGraphicsdoubleh,w;Rectangle(doubleu,doublev)h=u;w=v;voidparameter()System.out.println(h+“+w);voidarea()System.out.println(h*w);Rectanglerec=newRectangle(1.0,2.0);Circlecir=newCircle(3.0,“Red”);Graphicsg=rec,

36、cir;for(inti=0;ig.length;i+)gi.parameter();gi.area();classCircleextendsGraphicsdoubler;Stringc;Circle(doubleu,Stringv)r=u;c=v;voidparameter()System.out.println(r+“+c);voidarea()System.out.println(Math.PI*r*r);运行结果1.02.02.03.0Red28.274333882308138多态性(polymorphism)应用场合:不同子类可以用不同的方式实现同一共同接口,该共同接口建立了一个基

37、本形式60第三章面向对象特征1.基本概念2.类的定义3.对象4.类的继承和多态5.接口和包6.常用工具类61对象n引用对象的变量n格式: 对象名.变量名n引用对象的方法n格式: 对象名.方法名n例1nVector v = new Vector();nv.addElement(“hello world”);n例2nint a= 1, 2, 3, 4, 5; nint size = a.length;n例3nSystem.out.println();62对象n通过对象引用对象的成员变量和成员方法classQangleinta,h;Qangle()a=10;h=20;Qangle(intx,inty

38、)a=x;h=y;Qangle(Qangler)a=r.width();h=r.height();voidset(intx,inty)a=x;h=y;q1.set(30,40);q1.a=30;q1.h=40;目的相同第一方式更安全、更面向对象(数据封装)直接操纵变量63对象的释放n将对象从内存中清除n内存的管理(枯燥、容易出错)n垃圾回收(Garbage Collection)n垃圾搜集器(Garbage Collector)n周期性地释放不再被引用的对象,自动完成n手动完成,System.gc();npublic static void gc() - Runs the garbage co

39、llector. TheJavaplatformallowsyoutocreateasmanyobjectsasyouwant(limited,ofcourse,bywhatyoursystemcanhandle),andyoudonthavetoworryaboutdestroyingthem.TheJavaruntimeenvironmentdeletesobjectswhenitdeterminesthattheyarenolongerbeingused.Thisprocessiscalledgarbage collection.64对象的使用n访问对象的私有(private)成员n通过

40、定义一个公共方法来实现classStudentprivateStringname;privateStringid;Student(Strings1,Strings2)name=s1;id=s2;StringgetName()returnname;voidsetName(Strings)name=s;Studentst=newStudent(“aloha”,“001”);Stringn=st.getName();st.setName(“csma”);n=st.getName();65对象的使用n对象作为方法的参数访问权限修饰符 方法返回类型 方法名(参数) throws 异常名方法体;n参数:

41、类型 变量名, n类型: 基本数据类型/复合类型(对象)n参数的传递nPass by value66n例 对象用作方法的参数对象的使用classjex6_10publicstaticvoidmain(Stringargs)Spots=newSpot(2,3);System.out.println(“s点的坐标:”+s.getX()+“,”+s.getY();Transts=newTrans();ts.move(s,4,5);System.out.println(“s点的坐标:”+s.getX()+“,”+s.getY();classSpotprivateintx,y;Spot(intu,int

42、v)setX(u);setY(v);voidsetX(intx1)x=x1;voidsetY(inty1)y=y1;intgetX()returnx;intgetY()returny;classTransvoidmove(Spotp,inth,intk)p.setX(p.getX()+h);p.setY(p.getY()+k);classjex6_10publicstaticvoidmain(Stringargs)Spots=newSpot(2,3);System.out.println(“s点的坐标:”+s.getX()+“,”+s.getY();Trans.move(s,4,5);Syst

43、em.out.println(“s点的坐标:”+s.getX()+“,”+s.getY();classSpotprivateintx,y;Spot(intu,intv)setX(u);setY(v);voidsetX(intx1)x=x1;voidsetY(inty1)y=y1;intgetX()returnx;intgetY()returny;classTransstaticvoidmove(Spotp,inth,intk)p.setX(p.getX()+h);p.setY(p.getY()+k);classjex6_10publicstaticvoidmain(Stringargs)Spo

44、ts=newSpot(2,3);System.out.println(“s点的坐标:”+s.getX()+“,”+s.getY();s.move(4,5);System.out.println(“s点的坐标:”+s.getX()+“,”+s.getY();classSpotprivateintx,y;Spot(intu,intv)setX(u);setY(v);voidsetX(intx1)x=x1;voidsetY(inty1)y=y1;intgetX()returnx;intgetY()returny;voidmove(inth,intk)x=x+h;y=y+k;67对象的使用n对象的访问

45、n对象作为方法的返回值访问权限修饰符 方法返回类型 方法名(参数) throws 异常名方法体;n返回类型n有返回值: 基本数据类型/复合类型(对象)n无返回值: void68对象的使用n对象作为方法的返回值n例: 求两点坐标之间的中点坐标n思路: (x1, y1) 和(x2, y2)(x, y)nx=(x1+x2)/2, y=(y1+y2)/2nSpot s1 = new Spot(2, 3);nSpot s2 = new Spot(4, 5);nSpot s = s1.midSpot(s2);69n例 对象用作方法的返回值对象的使用classjex6_13publicstaticvoidm

46、ain(Stringargs)Spots1=newSpot(3.0,5.0);Spots2=newSpot(6.0,8.0);System.out.println(“s1点的坐标:”+s1.getX()+“,”+s1.getY();System.out.println(“s2点的坐标:”+s2.getX()+“,”+s2.getY();Spots=s1.midSpot(s2);System.out.println(“中点的坐标:”+s.getX()+“,”+s.getY();classSpotprivatedoublex,y;Spot(doubleu,doublev)setX(u);setY(

47、v);voidsetX(doublex1)x=x1;voidsetY(doubley1)y=y1;doublegetX()returnx;doublegetY()returny;SpotmidSpot(Spots)doublemidX=(x+s.getX()/2;doublemidY=(y+s.getY()/2;returnnewSpot(midX,midY);70对象的使用n数组: 类型相同的一列元素n简单的数组publicclassArrayDemopublicstaticvoidmain(Stringargs)intanArray=newint10;for(inti=0;ianArray

48、.length;i+)anArrayi=i;System.out.print(anArrayi+);System.out.println();71对象的使用n对象数组classTestpublicstaticvoidmain(Stringargs)inta=newint5;for(inti=0;ia.length;i+)System.out.println(ai);Strings=newString5;for(inti=0;is.length;i+)System.out.println(si);System.out.println(si.length();72对象的使用n对象数组classSt

49、udentprivateStringname;privateStringid;Student(Strings1,Strings2)name=s1;id=s2;StringgetName()returnname;voidsetName(Strings)name=s;voiddisplay()System.out.println(name+“”+id);Studentst=newStudent10;for(inti=0;ist.length;i+)sti=newStudent();for(inti=0;ist.length;i+)sti.display();73对象的使用n对象作为另一个对象的成员

50、变量n一个对象中包含另一个对象,组合关系classStudentprivateStringname;privateStringid;Student(Strings1,Strings2)name=s1;id=s2;StringgetName()returnname;voidsetName(Strings)name=s;74对象的使用n对象作为另一个对象的成员变量classMobilePhoneprivateStringtype;privateWatchw;MobilePhone(Strings)type=s;voidsetWatch(Watcha)w=a;longgetTime()returnw

51、.getTime();classWatchlonggetTime()returnSystem.currentTimeMillis();MobilePhonemp=newMobilePhone(“nokia”);Watchw=newWatch();mp.setWatch(w);longl=mp.getTime();publicstaticlongcurrentTimeMillis()thedifference,measuredinmilliseconds,betweenthecurrenttimeandmidnight,January1,1970UTC75对象的使用n关键词 thisnthis指

52、当前对象n应用1: 加强程序可读性(this可有可无)76对象的使用n例1: Demo1.java (调用变量)classDemo1doublex,y;Demo1(doublei,doublej)this.x=i;this.y=j;doubleave()return(x+y)/2;publicstaticvoidmain(Stringargs)Demo1d=newDemo1(3,4);System.out.println(d.ave();77对象的使用n例2: Demo2.java (调用方法)classDemo2intx,y,z;Demo2(inta,intb)x=a;y=b;this.so

53、rt(a,b);voidsort(inta,intb)intt;if(xy)t=x;x=y;y=t78对象的使用n例3: Demo3.java (调用方法)classDemo3intx,y;Demo3(inta,intb)x=a;y=b;voidchange(inti,intj) x=i;y=j;this.sort();voidsort()intt;if(xy)t=x;x=y;y=t79对象的使用n关键词 thisnthis指当前对象n应用2: 对同一个对象执行多次方法调用classLeafinti=0;Leafincrement()i+;returnthis;voidprint()Syste

54、m.out.println(“i=”+i);Leafx=newLeaf();x.increment().increment().increment().print();80对象的使用n关键词 thisnthis指当前对象n应用3: 在一个构造函数中调用另一个构造函数classFlowerStringname;intprice;Flower()this(tulip,10);Flower(Strings,inti)name=s;price=i;voidprint()System.out.println(name+price);publicstaticvoidmain(Stringargs)Flow

55、erf=newFlower();f.print();81第三章面向对象特征1.基本概念2.类的定义3.对象4.类的继承和多态5.接口和包6.常用工具类82类的继承n父类与子类的关系 (extends)n基本内容1.子类可调用父类的方法和变量,子类可增加父类中没有的方法和变量2.子类可重新定义父类的静态/实例变量3.子类可重新定义父类的静态/实例方法4.继承中的构造方法5.类成员访问修饰符与继承的关系83类的继承n子类可调用父类的方法和变量n子类可增加父类中没有的方法和变量classVehicleStringbrand;voidsetB(Strings)brand=s;voidshowB()Sy

56、stem.out.println(brand);classBusextendsVehicleintgas;voidsetG(intg)gas=g;voidshowG()System.out.println(gas);Busb=newBus();b.setB(“audi”);/*b.setG(100);b.showB();/*b.showG();子类继承父类的方法和变量,则这些方法和变量就属于子类,则子类对象对这些方法和变量的调用是显而易见的84类的继承n子类可重新定义父类中已有的变量n父类中同名的变量无效(隐藏)n通过“super.变量名” 和父类名.变量名(static变量)引用classA

57、inti=256,j=64;staticintk=32;finalfloate=2.718f;classBextendsApubliccharj=x;finaldoublek=5;staticinte=321;voidshow()System.out.println(i+“+j+“+k+“+e);voidshowA()System.out.println(super.j+“+A.k+“+super.e);Bb=newB();b.show();b.showA();256x5.032164322.718this.变量名this.方法名this()super.变量名super.方法名super()s

58、uper?当前对象/当前对象的父对象/其他85n继承中的super对象类的继承父类子类实例化一个子类对象thissuper调用父类的变量和方法调用子类的变量和方法86n继承中的构造方法类的继承publicclassCartoonextendsDrawingCartoon()System.out.println(CartoonConstructor);publicstaticvoidmain(Stringargs)Cartoonc=newCartoon();classArtArt()System.out.println(ArtConstructor);classDrawingextendsArt

59、Drawing()System.out.println(DrawingConstructor);ArtConstructorDrawingConstructorCartoonConstructor子类的构造方法必须调用父类的构造方法classDrawingextendsArt/*Drawing()System.out.println(DrawingConstructor);*/ArtConstructorCartoonConstructorpublicclassCartoonextendsDrawingCartoon()super();System.out.println(CartoonCon

60、structor);publicstaticvoidmain(Stringargs)Cartoonc=newCartoon();87n再谈继承中的构造方法类的继承publicclassChessextendsBoardGameChess()super(3);System.out.println(CartoonConstructor);publicstaticvoidmain(Stringargs)Chessc=newChess();classGameGame(inti)System.out.println(“GameConstructor);classBoardGameextendsGameB

61、oardGame(inti)super(i);System.out.println(“BoardGameConstructor);子类的构造方法必须要对父类的构造方法进行调用,不管以任何形式,否则编译出错88n再谈继承中的构造方法类的继承classAA(inti)classBextendsAB(Strings)B(Strings)super();89类的继承n子类可重新定义父类中已有的静态变量(static)classPointstaticintx=2;classTPointextendsPointstaticdoublex=4.7;publicstaticvoidmain(Stringarg

62、s)newTPoint().printX();voidprintX()System.out.println(x+Point.x);4.7290类的继承n子类可重新定义父类中已有的实例变量classPointintx=2;classTPointextendsPointdoublex=4.7;voidprintBoth()System.out.println(x+super.x);publicstaticvoidmain(Stringargs)TPointt=newTPoint();t.printBoth();System.out.println(t.x+(Point)t).x);4.724.72

63、91类的继承n再谈子类对父类变量的继承importpoints.Point3d;classPoint4dextendsPoint3dintw;publicvoidmove(intdx,intdy,intdz,intdw)x+=dx;y+=dy;z+=dz;w+=dw;packagepoints;publicclassPointintx,y;publicvoidmove(intdx,intdy)x+=dx;y+=dy;packagepoints;publicclassPoint3dextendsPointintz;publicvoidmove(intdx,intdy,intdz)x+=dx;y+

64、=dy;z+=dz;目录结构/points/Point.class/points/Point3d.class/Point4d.classimportpoints.Point3d;classPoint4dextendsPoint3dintw;publicvoidmove(intdx,intdy,intdz,intdw)super.move(dx,dy,dz);w+=dw;编译时报错:x,y,z仅在本包中才能访问继承与类成员的访问修饰符有关!92类的继承n类成员访问修饰符与继承的关系classPointintx,y;privatePoint()reset();Point(intx,inty)thi

65、s.x=x;this.y=y;privatevoidreset()this.x=0;this.y=0;classColoredPointextendsPointintcolor;voidclear()reset();classTestpublicstaticvoidmain(Stringargs)ColoredPointc=newColoredPoint(0,0);c.reset();nAnerroroccursbecauseColoredPointhasnoconstructordeclaredwithtwointegerparameters,asrequestedbytheuseinmai

66、n.ThisillustratesthefactthatColoredPointdoesnotinherittheconstructorsofitssuperclassPoint.nAnothererroroccursbecauseColoredPointdeclaresnoconstructors,andthereforeadefaultconstructorforitisautomaticallycreated,andthisdefaultconstructorisequivalentto:ColoredPoint()super();whichinvokestheconstructor,w

67、ithnoarguments,forthedirectsuperclassoftheclassColoredPoint.TheerroristhattheconstructorforPointthattakesnoargumentsisprivate,andthereforeisnotaccessibleoutsidetheclassPoint.nTwomoreerrorsoccurbecausethemethodresetofclassPointisprivate,andthereforeisnotinheritedbyclassColoredPoint.93类的继承n类成员访问修饰符与继承

68、的关系n私有的(private)类成员不能被子类继承n公共的(public)和保护性的(protected)类成员能被子类继承,且子类和父类可以属于不同的包n无修饰的父类成员,仅在本包中才能被子类继承n构造函数不是类成员,所以不被继承packagepoints;publicclassPointpublicintx,y;protectedintuseCount=0;staticprotectedinttotalUseCount=0;publicvoidmove(intdx,intdy)x+=dx;y+=dy;useCount+;totalUseCount+;importpoints.Point;

69、classTestextendsPointpublicvoidmoveBack(intdx,intdy)x-=dx;y-=dy;useCount+;totalUseCount+;94类的继承n例classPositionintx,y;Position(intpx,intpy)x=px;y=py;voidshow()System.out.println(x+”,”+y);classSpotextendsPositionbooleandisplay;Spot(intsx,intsy,booleansf)super(sx,sy);display=sf;voidchange(intcx,intcy)x

70、=cx;y=cy;classBoxextendsSpotintr;Box(intbx,intby,intbr,booleanbf)super(bx,by,bf);r=br;voidadd(intda)r+=da;voidred(intda)r-=da;voidshow()System.out.print(“起点:”);super.show();System.out.print(“边长:”+r);if(display)System.out.println(“显示”);elseSystem.out.println(“不显示”);Spots=newSpot(100,100,false);s.show

71、();Boxb=newBox(100,100,30,true);b.show();b.change(200,300);b.add(50);b.show();95n继承中类对象作为参数传递类的继承classSidevoiddisplay()System.out.println(“平面:”);classSpotextendsSideprivateintx,y;Spot(intu,intv)x=u;y=v;voiddisplay()System.out.println(x+“+y);classLineextendsSideprivateintx1,y1,x2,y2;Line(inta1,intb1,

72、inta2,intb2)x1=a1;y1=b1;x2=a2;y2=b2;voiddisplay()System.out.println(x1+“+y1);System.out.println(x2+“+y2)Spots=newSpot(2,3);Linel=newLine(1,2,3,4);display(s);display(l);staticvoiddisplay(Sides)s.display();96nSubclassesinheritthosesuperclassmembersdeclaredaspublicorprotected.nSubclassesinheritthosesup

73、erclassmembersdeclaredwithnoaccessspecifieraslongasthesubclassisinthesamepackageasthesuperclass.nSubclassesdontinheritasuperclasssmemberifthesubclassdeclaresamemberwiththesamename.Inthecaseofmembervariables,themembervariableinthesubclasshidestheoneinthesuperclass.Inthecaseofmethods,themethodinthesub

74、classoverridestheoneinthesuperclass.小结97小结n类的继承n重写: 子类和父类的方法名、返回类型和参数相同,与重载(overload)的区别n如果是实例方法,则称为子类重写(overriding)父类的实例方法n如果是类方法,则称为子类隐藏父类的类方法(static)n实例方法不能重写静态方法n静态方法不能重写实例方法nfinal/private方法不能被重写或隐藏注: 实例变量可隐藏静态变量 静态变量可隐藏实例变量classFatherpublicvoidset()staticvoidget()classSonextendsFatherpublicvoid

75、set()staticvoidget()classSonextendsFatherpublicvoidget()staticvoidset()98类的继承n子类对象与父类对象Classroom c = new MMClassroom();(等价于)MMClassroom c1 = new MMClassroom();Classroom c = c1;子类对象可以被视为其父类的一个对象父类对象不能当作某一个子类对象ClassroomMMClassroom99n继承与组合类的继承classEnginepublicvoidstart()publicvoidrev()publicvoidstop()c

76、lassWheelpublicvoidinflate(inti)publicclassCarpublicEngineengine=newEngine();publicWheelwheel=newWheel4;publicDoorleft=newDoor();publicDoorright=newDoor();publicCar()for(inti=0;i4;i+)wheeli=newWheel();publicstaticvoidmain(Stringargs)Carcar=newCar();car.left.window.rollup();car.wheel0.inflate(72);cla

77、ssWindowpublicvoidrollup()publicvoidrolldown()classDoorpublicWindowwindow=newWindow();publicvoidopen()publicvoidclose()组合:有一个(has-a)继承:是一个(is-a)100n一个文件中定义多个JAVA类classGameGame(inti)System.out.println(GameConstructor);classBoardGameextendsGameBoardGame(inti)super(i);System.out.println(BoardGameConstr

78、uctor);publicclassChessextendsBoardGameChess()super(3);System.out.println(CartoonConstructor);publicstaticvoidmain(Stringargs)Chessc=newChess();n仅保存为一个Chess.java文件n编译后,产生三个class文件,Game.class、BoardGame.class、Chess.classn执行,Chess.classn注:在类定义中只能将一个类定义为public101第三章面向对象特征1.基本概念2.类的定义3.对象4.类的继承和多态5.接口和包6

79、.常用工具类102n接口是对abstract类的进一步扩展n接口中的方法都是未实现的(类似于抽象方法),目的是在实现接口的类之间建立一种协议n接口中的变量都是常量n定义n一个类符合某个或一组接口,利用implements接口(interface)Aninterfaceisanamedcollectionofmethoddefinitions(withoutimplementations).Aninterfacecanalsodeclareconstants. public interface 接口名 成员变量;方法声明; class 类名 implements 接口1, 接口2 103n接口名

80、修饰npublic: 无任何访问限制n无修饰: 仅限于本包中n接口变量默认都是“public static final”publicinterfaceMonthsintJANUARY=1,FEBRUARY=2,MARCH=3,APRIL=4,MAY=5,JUNE=6,JULY=7,AUGUST=8,SEPTEMBER=9,OCTOBER=10,NOVEMBER=11,DECEMBER=12;接口(interface)104接口(interface)n接口方法n无修饰n但在实现接口方法的类中,修饰符为publicinterfaceFiguredoublehalf=0.5,pi=3.14159;v

81、oidparameter();voidarea();classTriangleimplementsFiguredoubleb,h;Triangle(doubleu,doublev)b=u;h=v;publicvoidparameter()System.out.println(b+“+h);publicvoidarea()System.out.println(half*h*b);classCircleimplementsFiguredoublex,y,r;Circle(doubleu,doublev,doublem)x=u;y=v;r=m;publicvoidparameter()System.

82、out.println(x+“+y+“+r);publicvoidarea()System.out.println(pi*r*r);Trianglet=newTriangle(2,3);Circlec=newCircle(4,5,6);Figuref=t,c;for(inti=0;if.length;i+)fi.parameter();fi.area();105接口(interface)n接口的继承 extendsn将多个接口合并为一个新的接口interfaceDCintadd(intx,inty);interfaceDBextendsDCintsub(intx,inty);interface

83、DAextendsDBintmul(intx,inty);interfaceDYintdiv(intx,inty);interfaceDXextendsDYintmod(intx,inty);classDDimplementsDA,DXpublicintadd(intx,inty)returnx+y;publicintsub(intx,inty)returnx-y;publicintmul(intx,inty)returnx*y;publicintdiv(intx,inty)returnx/y;publicintmod(intx,inty)returnx%y;106接口(interface)n

84、利用接口实现多重继承(Multiple inheritance)nclass extends 父类 implements 接口interfaceCanFightvoidfight();interfaceCanSwimvoidswim();interfaceCanFlyvoidfly();classActionCharacterpublicvoidfight()classHeroextendsActionCharacterimplementsCanFight,CanSwim,CanFlypublicvoidswim()publicvoidfly()107接口(interface)n接口合并时的命

85、名冲突interfaceA1voidf();interfaceA2intf(inti);interfaceA3intf();classCpublicintf()return4;classC1implmentsA1,A2publicvoidf()publicintf(inti)return5;classC2extendsCimplmentsA2publicintf(inti)return5;classC3extendsCimplmentsA3publicintf()return5;classC4extendsCimplementsA1/overload/overload/implementsan

86、doverriding108接口(interface)n接口继承中的命名冲突interfaceBaseColorsintRED=1,GREEN=2,BLUE=4;interfaceRainbowColorsextendsBaseColorsintYELLOW=3,ORANGE=5,VIOLET=6;interfacePrintColorsextendsBaseColorsintYELLOW=8,CYAN=16,MAGENTA=32;interfaceLotsOfColorsextendsRainbowColors,PrintColorsintFUCHSIA=17,CHARTREUSE=RED+

87、90;classDDimplementsLotsOfColorspublicstaticvoidmain(Stringargs)System.out.println(YELLOW);classDDpublicstaticvoidmain(Stringargs)System.out.println(LotsOfColors.YELLOW);referencetoYELLOWisambiguous,bothvariableYELLOWinRainbowColorsandvariableYELLOWinPrintColorsmatch109nQuizpublicinterfaceMarker接口(i

88、nterface)110n为什么需要包?n使Java类更容易发现和使用n防止命名冲突n进行访问控制 n层次结构,特定的功能nA package is a collection of related classes and interfaces providing access protection and namespace management. nimport包(package)111包(package)/Graphic.javafilepublicabstractclassGraphic./Circle.javafilepublicclassCircleextendsGraphicimp

89、lementsDraggable./Rectangle.javafilepublicclassRectangleextendsGraphicimplementsDraggable./Draggable.javafilepublicinterfaceDraggable.n容易地决定那些类和接口是相互关联的n知道从哪里找到提供图形功能的类和接口n由于包建立了一个新的名字空间,所以你定义的类不会同其他包中的类名有冲突n可以容许在同一个包中无访问限制,同时可对在本包外的访问进行限制112n包的创建packagegraphics;publicclassCircleextendsGraphicimplem

90、entsDraggable.n包的命名n层次结构对应实际的目录结构ncom.sun.norg.w3c.norg.jalpha.包(package)113n包的使用n仅仅公共的(public)包成员(类、接口)可以在其所定义的包外被访问n三种方式n利用包成员的规范名(包名+类名)n引入(import)包成员名n引入(import)整个包成员包(package)114n例 packagegraphics;publicclassCircleextendsGraphicimplementsDraggable.n利用包成员的规范名(包名+类名)graphics.CirclemyCir=newgraphi

91、cs.Circle();n引入(import)包成员名importgraphics.Circle;CirclemyCir=newCircle();n引入(import)整个包成员importgraphics.*;CirclemyCir=newCircle();包(package)115n如何防止名字冲突/graphics.Circle.classpackagegraphics;publicclassCircle./mygraphics.Circle.classpackagemygraphics;publicclassCircle.包(package)importgraphics.*;impor

92、tmygraphics.*;classTest/Circlec;importgraphics.*;importmygraphics.*;classTestgraphics.Circlec=newgraphics.Circle();mygraphics.Circlec=newmygraphics.Circle();116n包与Java文件的对应关系 包(package)packageorg.jalpha;publicclassHelloWorld.根目录d:src源文件d:srcorgjalphaHelloWorld.java编译cdd:srcjavacorgjalphaHelloWorld.j

93、avaclass文件d:srcorgjalphaHelloWorld.class执行(在根目录)cdd:srcjavaorg.jalpha.HelloWorld执行(在其他目录)d:javaclasspathd:srcorg.jalpha.HelloWorld117n包与Java文件的对应关系 包(package)packageorg.aloha;importorg.jalpha.*;importorg.w3c.*;publicclassTest.class文件(org.jalpha)d:src1orgjalpha*.classclass文件(org.w3c)d:src2orgw3c*.cla

94、ssTest.class文件的根目录d:src执行(在根目录)d:srcjavaclasspathd:src1;d:src2;.org.aloha.Test执行(在其他目录)d:javaclasspathd:src1;d:src2;d:srcorg.aloha.Test118第三章面向对象特征1.基本概念2.类的定义3.对象4.类的继承和多态5.接口和包6.常用工具类119常用工具类nJava 2 Platform PackagesnJavaTM 2 Platform, Standard Edition, v 1.4.1 API SpecificationnJava语言基础类、Java类库n定

95、义描述见Java2SDK文档n135个包(package)njava.applet;java.awt;java.awt.eventnjava.io;java.lang;njava.sql;java.text;java.utilnjavax.swingnn2723个类(class)和接口(interface)n实现d:j2sdk1.4.1_01jrelibrt.jar(22.4MB)njartvfrt.jar|more120常用工具类njava.lang包nObject类nSystem类nMath类n基本数据类型的包装类n字符串操作类nString类nStringBuffer类nStringTo

96、kenizer类(java.util包)nRuntime类121java.lang.Object类nClass Object is the root of the class hierarchy. Every class has Object as a superclass. nAll objects, including arrays, implement the methods of this class. n子类可以对Object类的方法进行重写构造方法-publicObject()实例方法1.protectedObjectclone()throwsCloneNotSupportedEx

97、ception2.publicbooleanequals(Objectobj)3.protectedvoidfinalize()throwsThrowable4.publicfinalClassgetClass()5.publicinthashCode()6.publicfinalvoidnotify()7.publicfinalvoidnotifyAll()8.publicStringtoString()9.publicfinalvoidwait()throwsInterruptedException10.publicfinalvoidwait(longtimeout)throwsInter

98、ruptedException11.publicfinalvoidwait(longtimeout,intnanos)throwsInterruptedException122java.lang.System类n静态变量npublicstaticfinalInputStreamin(标准输入流)npublicstaticfinalPrintStreamout(标准输出流)npublicstaticfinalPrintStreamerr(标准错误输出流)n静态方法npublicstaticvoidarraycopy(Objectsrc,intsrcPos,Objectdest,intdestPo

99、s,intlength)npublicstaticvoidexit(intstatus)npublicstaticvoidgc()npublicstaticlongcurrentTimeMillis()n123java.lang.System类n获取当前时间npublic static long currentTimeMillis()nReturns: the difference, measured in milliseconds, between the current time and midnight, January 1, 1970 UTC (Universal time coord

100、inated).publicstaticvoidmain(Stringargs)longstart=System.currentTimeMillis();longend=System.currentTimeMillis();System.out.println(end-start);124java.lang.Math类n静态变量npublicstaticfinaldoubleEnpublicstaticfinaldoublePIn静态方法npublicstaticdoubleabs(doublea)npublicstaticdoubleceil(doublea)npublicstaticdou

101、blefloor(doublea)npublicstaticdoublemax(doublea,doubleb)n125基本数据类型的包装类n基本数据类型: byte, short, int, long, float, double, boolean, char n对应的包装类: Byte, Short, Integer, Long, Float, Double, Boolean, Charactern作用n包装类对象中包含有一个对应基本类型的值n提供有基本类型和字符串(String)之间的转换函数n定义有一些常数和方法126基本数据类型的包装类n常数定义bytelargestByte=Byt

102、e.MAX_VALUE;/127short largestShort=Short.MAX_VALUE;/32767intlargestInteger =Integer.MAX_VALUE;/2147483647longlargestLong=Long.MAX_VALUE;/9223372036854775807floatlargestFloat=Float.MAX_VALUE;/3.40282e+38doublelargestDouble=Double.MAX_VALUE;/1.79769e+308127基本数据类型的包装类n基本类型和字符串(String)之间的转换nInteger类举例n字

103、符串转换为整数npublic static int parseInt(String s) throws NumberFormatExceptionnpublic static int parseInt(String s, int radix) throws NumberFormatExceptionStrings=“123”;inti=Integer.parseInt(s);parseInt(0,10)parseInt(473,10)parseInt(-0,10)parseInt(-FF,16)parseInt(1100110,2)parseInt(2147483647,10)parseInt

104、(-2147483648,10)parseInt(2147483648,10)parseInt(99,8)parseInt(Kona,10)parseInt(Kona,27)returns0returns473returns0returns-255returns102returns2147483647returns-2147483648throwsaNumberFormatExceptionthrowsaNumberFormatExceptionthrowsaNumberFormatExceptionreturns411787128基本数据类型的包装类n基本类型和字符串(String)之间的转

105、换nInteger类举例n整数转换为字符串npublicstaticStringtoString(inti)npublicstaticStringtoString(inti,intradix)npublicstaticStringtoBinaryString(inti)npublicstaticStringtoHexString(inti)npublicstaticStringtoOctalString(inti)inti=123;Strings1=Integer.toString(i);Strings2=Integer.toString(i,10);Strings3=Integer.toSt

106、ring(i,2);Strings4=Integer.toString(i,8);Strings5=Integer.toString(i,16);Strings6=Integer.toBinaryString(i);Strings7=Integer.toHexString(i);Strings8=Integer.toOctalString(i);12312311110111737b11110117b173129字符串操作类n三个类njava.lang.String类njava.lang.StringBuffer类njava.util.StringTokenizer类n不同的应用场合130字符串

107、操作类njava.lang.String类字符串/字符序列n构造方法npublicString()npublicString(bytebytes)npublicString(bytebytes,intoffset,intlength)npublicString(bytebytes,StringcharsetName)npublicString(charvalue)npublicString(charvalue,intoffset,intcount)npublicString(Stringoriginal)131字符串操作类njava.lang.String类字符串/字符序列n构造方法的使用St

108、rings=newString();charc=a,b,c;Strings=newString(c);charc=语,言;Strings=newString(c);byteb=97,98,99;Strings=newString(b);Strings=“abc”;Strings=“语言”;132字符串操作类njava.lang.String类字符串/字符序列n判断字符串相等的方法npublicbooleanequals(ObjectanObject)判断是否是同一个对象,是ture;然后anObject是否为一个字符串对象,否false;判断是否内容相同npublicbooleanequals

109、IgnoreCase(StringanotherString)判断逻辑与equals相同,仅仅在判断内容上不考虑大小写npublicintcompareTo(Objecto)若o不是字符串对象,则抛错;若是则调用下面的函数npublicintcompareTo(StringanotherString)判断两个字符串的内容是否相同,是0;否不等于0的整数npublicintcompareToIgnoreCase(Stringstr)基本功能同上,仅仅在判断时不考虑大小写133字符串操作类njava.lang.String类字符串/字符序列n判断字符串相等的方法Strings1=java语言;St

110、rings2=JavA语言;System.out.println(s1.equals(s2);System.out.println(s1.equalsIgnoreCase(s2);System.out.println(pareTo(s2);System.out.println(pareToIgnoreCase(s2);运行结果:falsetrue320134字符串操作类njava.lang.String类字符串/字符序列n获取长度npublicintlength() 字符串的长度,即包含多少个字符n获取特定子串(substring)和字符npublicStringsubstring(intbe

111、ginIndex)npublicStringsubstring(intbeginIndex,intendIndex)nbeginIndex:起始索引位置(包含)nendIndex:结束索引位置(不包含)npubliccharcharAt(intindex)135字符串操作类njava.lang.String类字符串/字符序列n方法举例Strings1=java语言;Strings2=JavA语言;System.out.println(s1.length();System.out.println(s2.length();System.out.println(s1.substring(0,4);S

112、ystem.out.println(s1.substring(4);System.out.println(s2.substring(0,4);System.out.println(s2.substring(4);System.out.println(s1.charAt(0);运行结果:66java语言JavA语言j136字符串操作类njava.lang.String类字符串/字符序列n字符串前缀(prefix)/后缀(suffix)的判断npublicbooleanstartsWith(Stringprefix)判断字符串是否以一特定的字符串开头npublicbooleanstartsWith

113、(Stringprefix,inttoffset)npublicbooleanendsWith(Stringsuffix)判断字符串是否以一特定的字符串开头System.out.println(java语言.startsWith(java);System.out.println(java语言.startsWith(ava,1);System.out.println(java语言.endsWith(语言);137字符串操作类njava.lang.String类字符串/字符序列n查询特定字符/字符串的位置npublicintindexOf(intch)该字符在字符串中第一次出现位置的索引值;否则返

114、回-1npublicintindexOf(intch,intfromIndex)npublicintindexOf(Stringstr)npublicintindexOf(Stringstr,intfromIndex)npublicintlastIndexOf(intch)npublicintlastIndexOf(intch,intfromIndex)npublicintlastIndexOf(Stringstr)npublicintlastIndexOf(Stringstr,intfromIndex)从前往后从后往前138字符串操作类njava.lang.String类字符串/字符序列n方

115、法举例Strings=“java语言”;System.out.println(s.indexOf(a);System.out.println(s.indexOf(a,2);System.out.println(s.indexOf(“a”);System.out.println(s.indexOf(“语言”);System.out.println(s.lastIndexOf(a);System.out.println(s.lastIndexOf(v,1);System.out.println(s.lastIndexOf(“语言”);System.out.println(s.lastIndexOf

116、(“v”,2);运行结果:13143-142java语言139字符串操作类njava.lang.String类字符串/字符序列n字符串转变为数组npublic byte getBytes() 将字符串转变为一个字节数组npublic byte getBytes(StringcharsetName) throws UnsupportedEncodingException 按特定的字符编码格式将字符串转变为一个字节数组npublic char toCharArray() 将字符串转变为一个字符数组140字符串操作类njava.lang.String类字符串/字符序列n方法举例Strings=jav

117、a语言;charc=s.toCharArray();System.out.println(c.length);byteb=s.getBytes();System.out.println(b.length);b=s.getBytes(ISO8859-1);System.out.println(b.length);运行结果:686中文Windows操作系统:默认字符集GB2312其他系统:默认字符集ISO-8859-1141字符串操作类njava.lang.String类字符串/字符序列n字符串npublicStringsplit(Stringregex)142字符串操作类njava.lang.S

118、tring类字符串/字符序列n其他方法npublic String concat(Stringstr) 连接字符串 cares.concat(s) returns caress to.concat(get).concat(her) returns together npublic String replace(charoldChar, charnewChar) 在字符串中进行字符替换 mesquite in your cellar.replace(e, o) returns mosquito in your collar” JonL.replace(q, x) returns JonL (no

119、 change) 143字符串操作类njava.lang.String类字符串/字符序列n其他方法npublic String trim() 将字符串头尾的空格字符删除npublic String toLowerCase() 字符串中字符转为小写npublic String toUpperCase() 字符串中字符转为大写n一些静态方法npublic static String valueOf(booleanb) npublic static String valueOf(charc) npublic static String valueOf(inti) npublic static Str

120、ing valueOf(longl) npublic static String valueOf(floatf) npublic static String valueOf(doubled) 144字符串操作类njava.lang.String类字符串/字符序列nQuizStrings1=newString(“java”);Strings2=newString(“java”);System.out.println(s1=s2);System.out.println(s1.equals(s2);System.out.println(pareTo(s2);运行结果:falsetrue0truetr

121、ue0falsetrue0Strings3=“java”;Strings4=“java”;System.out.println(s3=s4);System.out.println(s3.equals(s4);System.out.println(pareTo(s4);System.out.println(s2=s4);System.out.println(s2.equals(s4);System.out.println(pareTo(s4);结论:1.Strings1=“abc”;字符串常量对象(immutable)Strings2=“abc”;不同常量对象共享同一对象2.其他字符串对象则可理

122、解为对字符串常量对象进行了一层包装System.out.println(s2.intern()=s4);true145字符串操作类njava.lang.String类字符串/字符序列nQuizpackagetestPackage;classTestpublicstaticvoidmain(Stringargs)Stringhello=Hello,lo=lo;System.out.println(hello=Hello);System.out.println(Other.hello=hello);System.out.println(other.Other.hello =hello);Syste

123、m.out.println(hello=(Hel+lo);System.out.println(hello=(Hel+lo);System.out.println(hello=(Hel+lo).intern();classOtherstaticStringhello=Hello;运行结果:truetruetruetruefalsetruepackageother;publicclassOtherstaticStringhello=Hello;结论:1.Stringscomputedbyconstantexpressionsarecomputedatcompiletimeandthentreat

124、edasiftheywereliterals.2.Stringscomputedatruntimearenewlycreatedandthereforedistinct.146字符串操作类njava.lang.StringBuffer类n一个可变(mutable)/动态的字符序列n构造方法npublicStringBuffer()npublicStringBuffer(Stringstr) n主要方法n添加(append)和插入(insert, 指定位置)npublic StringBuffer append(booleanb) npublic StringBuffer insert(into

125、ffset, booleanb) nboolean, char, char, double, float, int, long, Stringn转换为字符串 - public String toString() 147字符串操作类njava.lang.StringBuffer类方法举例Strings=java语言;StringBufferbuffer=newStringBuffer(s);buffer.append(“easy”);buffer.insert(6,“is“);s=buffer.toString();System.out.println(s);运行结果:java语言iseasy.

126、148字符串操作类n字符串的连接运算(Concatenation)n“java”和“语言”1.String s = “java” + “语言”;2.String s = “java”.concat(“语言”);3.StringBuffer buffer = new StringBuffer(“java”); buffer.append(“语言”); String s = buffer.toString();n常用第1种和第3种方法149字符串操作类n字符串的连接运算(Concatenation)n+与append方法比较classMyTimerprivatefinallongstart;pub

127、licMyTimer()start=System.currentTimeMillis();publiclonggetElapsed()returnSystem.currentTimeMillis()-start;publicclassAppDemostaticfinalintN=47500;publicstaticvoidmain(Stringargs)MyTimermt=newMyTimer();Stringstr1=;for(inti=1;i=N;i+)str1=str1+*;System.out.println(#1stime=+mt.getElapsed();mt=newMyTimer

128、();StringBuffersb=newStringBuffer();for(inti=1;i=N;i+)sb.append(*);Stringstr2=sb.toString();System.out.println(#2stime=+mt.getElapsed();运行结果:#1stime=138750#2stime=20效率和代码优化150字符串操作类n字符串的连接运算(Concatenation)n+: 算术运算符1.int a = 1, b = 2; String c = “ men”;2.String s = a + b + c;n3 menn隐含结合率 (a + b) + c1

129、.String s = c + b + a;nmen 21151字符串操作类njava.util.StringTokenizer类n将一个字符串按特定的要求切分开nOne String more Tokensn构造方法npublic StringTokenizer(Stringstr) 按默认的分隔符将字符串分割 四个字符“tnrf”npublic StringTokenizer(Stringstr, Stringdelim) 按指定的分割符将字符串分割n方法npublic boolean hasMoreTokens() 判断是否有tokennpublic String nextToken()

130、 得到下一个token152字符串操作类njava.util.StringTokenizer类n方法举例Strings=thisisatest;StringTokenizerst=newStringTokenizer(s);while(st.hasMoreTokens()System.out.println(st.nextToken();运行结果:thisisatestStrings=this:is:a:test”;StringTokenizerst=newStringTokenizer(s,“:”);while(st.hasMoreTokens()System.out.println(st.

131、nextToken();运行结果:thisisatest153执行外部程序njava.lang.Runtime类npublicProcessexec(Stringcommand)throwsIOExceptionnExecutesthespecifiedstringcommandinaseparateprocess.npublicProcessexec(Stringcmdarray)throwsIOExceptionnExecutesthespecifiedcommandandargumentsinaseparateprocess.154执行外部程序njava.lang.Runtime类nWindow NT/2000/XPncmd.exe /C 命令nWindows 95/ /C 命令155执行外部程序njava.lang.Runtime类importjava.io.IOException;classTestpublicstaticvoidmain(Stringargs)throwsIOExceptionRuntime.getRuntime().exec(cmd.exe/C+args0);156第三章结束!157

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号