course05-对象和类.ppt

上传人:max****ui 文档编号:11494639 上传时间:2020-04-25 格式:PPT 页数:42 大小:332KB
返回 下载 相关 举报
course05-对象和类.ppt_第1页
第1页 / 共42页
course05-对象和类.ppt_第2页
第2页 / 共42页
course05-对象和类.ppt_第3页
第3页 / 共42页
点击查看更多>>
资源描述
JAVA语言程序设计,第七讲对象和类(续),类的继承(extends)抽象类(abstractclass)静态变量的初始化接口(interface),类的继承,父类与子类的关系(extends)基本内容子类可调用父类的非私有方法和变量,子类可增加父类中没有的方法和变量子类可重新定义父类的静态/实例变量子类可重新定义父类的静态/实例方法继承中的构造方法类成员访问修饰符与继承的关系,类的继承,子类可调用父类的非私有方法和变量子类可增加父类中没有的方法和变量,classVehicleStringbrand;voidsetB(Strings)brand=s;voidshowB()System.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();,子类继承父类的方法和变量,则这些方法和变量就属于子类,则子类对象对这些方法和变量的调用是显而易见的,类的继承,子类可重新定义父类中已有的变量父类中同名的变量无效(隐藏)通过“super.变量名”和父类名.变量名(static变量)引用,classAinti=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.718,this.变量名this.方法名this()super.变量名super.方法名super(),super?当前对象/当前对象的父对象/其他,继承中的super对象,类的继承,父类,子类,调用父类的变量和方法,调用子类的变量和方法,3.父类对象与子类对象的转换,父类对象和子类对象的转化需要注意如下的原则:(1)子类对象可以被视为是其父类的一个对象;(2)父类对象不能被当作是其某一个子类的对象;(3)如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数;(4)如果父类对象引用指向的实际是一个子类对象(在以前的某个时候根据(1)把子类对象的引用赋值给这个父类对象的引用),那么这个父类对象的引用可以用强制类型转换转化成子类对象的引用。,SuperClasssc=newSubClass();,sc,SuperClass,SubClass,SubClasssb=newSuperClass();,sb,SubClass,SuperClass,继承中的构造方法,类的继承,publicclassCartoonextendsDrawingCartoon()System.out.println(CartoonConstructor);publicstaticvoidmain(Stringargs)Cartoonc=newCartoon();,classArtArt()System.out.println(ArtConstructor);,classDrawingextendsArtDrawing()System.out.println(DrawingConstructor);,ArtConstructorDrawingConstructorCartoonConstructor,子类的构造方法必须调用父类的构造方法,classDrawingextendsArt/*Drawing()System.out.println(DrawingConstructor);*/,ArtConstructorCartoonConstructor,publicclassCartoonextendsDrawingCartoon()super();System.out.println(CartoonConstructor);publicstaticvoidmain(Stringargs)Cartoonc=newCartoon();,再谈继承中的构造方法,类的继承,publicclassChessextendsBoardGameChess()super(3);System.out.println(CartoonConstructor);publicstaticvoidmain(Stringargs)Chessc=newChess();,classGameGame(inti)System.out.println(“GameConstructor);,classBoardGameextendsGameBoardGame(inti)super(i);System.out.println(“BoardGameConstructor);,子类的构造方法必须要对父类的构造方法进行调用,不管以任何形式,否则编译出错,再谈继承中的构造方法,类的继承,classAA(inti),classBextendsAB(Strings),B(Strings)super();,类的继承,子类可重新定义父类中已有的静态变量(static),classPointstaticintx=2;classTPointextendsPointstaticdoublex=4.7;publicstaticvoidmain(Stringargs)newTPoint().printX();voidprintX()System.out.println(x+Point.x);,4.72,类的继承,子类可重新定义父类中已有的实例变量,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,类的继承,再谈子类对父类变量的继承,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+=dy;z+=dz;,目录结构/points/Point.class/points/Point3d.class/Point4d.class,importpoints.Point3d;classPoint4dextendsPoint3dintw;publicvoidmove(intdx,intdy,intdz,intdw)super.move(dx,dy,dz);w+=dw;,编译时报错:x,y,z仅在本包中才能访问,继承与类成员的访问修饰符有关!,类的继承,类成员访问修饰符与继承的关系,classPointintx,y;privatePoint()reset();Point(intx,inty)this.x=x;this.y=y;privatevoidreset()this.x=0;this.y=0;,classColoredPointextendsPointintcolor;voidclear()reset();,classTestpublicstaticvoidmain(Stringargs)ColoredPointc=newColoredPoint(0,0);c.reset();,AnerroroccursbecauseColoredPointhasnoconstructordeclaredwithtwointegerparameters,asrequestedbytheuseinmain.ThisillustratesthefactthatColoredPointdoesnotinherittheconstructorsofitssuperclassPoint.,AnothererroroccursbecauseColoredPointdeclaresnoconstructors,andthereforeadefaultconstructorforitisautomaticallycreated,andthisdefaultconstructorisequivalentto:ColoredPoint()super();whichinvokestheconstructor,withnoarguments,forthedirectsuperclassoftheclassColoredPoint.TheerroristhattheconstructorforPointthattakesnoargumentsisprivate,andthereforeisnotaccessibleoutsidetheclassPoint.,TwomoreerrorsoccurbecausethemethodresetofclassPointisprivate,andthereforeisnotinheritedbyclassColoredPoint.,类的继承,类成员访问修饰符与继承的关系私有的(private)类成员不能被子类继承公共的(public)和保护性的(protected)类成员能被子类继承,且子类和父类可以属于不同的包无修饰的父类成员,仅在本包中才能被子类继承构造函数不是类成员,所以不被继承,packagepoints;publicclassPointpublicintx,y;protectedintuseCount=0;staticprotectedinttotalUseCount=0;publicvoidmove(intdx,intdy)x+=dx;y+=dy;useCount+;totalUseCount+;,importpoints.Point;classTestextendsPointpublicvoidmoveBack(intdx,intdy)x-=dx;y-=dy;useCount+;totalUseCount+;,类的继承,例,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=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();Boxb=newBox(100,100,30,true);b.show();b.change(200,300);b.add(50);b.show();,继承中类对象作为参数传递,类的继承,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,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();,Subclassesinheritthosesuperclassmembersdeclaredaspublicorprotected.Subclassesinheritthosesuperclassmembersdeclaredwithnoaccessspecifieraslongasthesubclassisinthesamepackageasthesuperclass.Subclassesdontinheritasuperclasssmemberifthesubclassdeclaresamemberwiththesamename.Inthecaseofmembervariables,themembervariableinthesubclasshidestheoneinthesuperclass.Inthecaseofmethods,themethodinthesubclassoverridestheoneinthesuperclass.,小结,小结,类的继承重写:子类和父类的方法名、返回类型和参数相同,与重载(overload)的区别如果是实例方法,则称为子类重写(overriding)父类的实例方法如果是类方法,则称为子类隐藏父类的类方法(static)实例方法不能重写静态方法静态方法不能重写实例方法final/private方法不能被重写或隐藏注:实例变量可隐藏静态变量静态变量可隐藏实例变量,classFatherpublicvoidset()staticvoidget(),classSonextendsFatherpublicvoidset()staticvoidget(),classSonextendsFatherpublicvoidget()staticvoidset(),类的继承,子类对象与父类对象Classroomc=newMMClassroom();(等价于)MMClassroomc1=newMMClassroom();Classroomc=c1;子类对象可以被视为其父类的一个对象父类对象不能当作某一个子类对象,继承与组合,类的继承,classEnginepublicvoidstart()publicvoidrev()publicvoidstop(),classWheelpublicvoidinflate(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);,classWindowpublicvoidrollup()publicvoidrolldown(),classDoorpublicWindowwindow=newWindow();publicvoidopen()publicvoidclose(),组合:有一个(has-a),继承:是一个(is-a),一个文件中定义多个JAVA类,classGameGame(inti)System.out.println(GameConstructor);classBoardGameextendsGameBoardGame(inti)super(i);System.out.println(BoardGameConstructor);publicclassChessextendsBoardGameChess()super(3);System.out.println(CartoonConstructor);publicstaticvoidmain(Stringargs)Chessc=newChess();,仅保存为一个Chess.java文件编译后,产生三个class文件,Game.class、BoardGame.class、Chess.class执行,Chess.class注:在类定义中只能将一个类定义为public,第七讲对象和类(续),类的继承(extends)抽象类(abstractclass)静态变量的初始化接口(interface),抽象类(abstractclass),一个未完成的类仅仅抽象类可以包含抽象方法(abstractmethods)抽象方法:仅仅申明了方法,但未实现有访问修饰词返回值类型方法名参数列表无方法体,抽象类(abstractclass),abstractclassPointintx=1,y=1;voidmove(intdx,intdy)x+=dx;y+=dy;alert();abstractvoidalert();,abstractclassColoredPointextendsPointintcolor;,classSimplePointextendsPointvoidalert(),抽象方法:有访问修饰词、返回值类型、方法名和参数列表,无方法体,抽象类(abstractclass),抽象类不能被实例化,例Pointp=newPoint();子类继承抽象类时,必须重写抽象方法,否则仍为抽象类,abstractclassPointintx=1,y=1;voidmove(intdx,intdy)x+=dx;y+=dy;alert();abstractvoidalert();,abstractclassColoredPointextendsPointintcolor;,classSimplePointextendsPointvoidalert(),Pointp=newSimplePoint();,抽象类(abstractclass),多态性,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,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),应用场合:不同子类可以用不同的方式实现同一共同接口,该共同接口建立了一个基本形式,第七讲对象和类(续),类的继承(extends)抽象类(abstractclass)静态变量的初始化接口(interface),static变量的初始化,classSmemberstaticinti=100;staticbooleanb=true;charc=t;publicSmember()publicstaticvoidmain(Stringargs)Smemberm1=newSmember();Smemberm2=newSmember();,不论产生多少个对象,属于类的静态变量只有一份,即只占有一份存储空间,classSmemberstaticinti;staticbooleanb;statici=100;b=true;System.out.println(“Instaticblock”);charc=t;publicSmember()System.out.println(“Inconstructor”);publicstaticvoidmain(Stringargs)Smemberm1=newSmember();Smemberm2=newSmember();,输出结果InstaticblockInconstructorInconstructor,设计模式的例子,classSingletonprivatestaticSingletonme=newSingleton();publicstaticSingletongetSingleton()returnme;privateSingleton()publicstaticvoidmain(Stringargs)Singletons1=Singleton.getSingleton();Singletons2=Singleton.getSingleton();if(s1=s2)System.out.println(s1iss2);elseSystem.out.println(s1isnots2);,该Singleton类只有一个实例,即该Singleton类只能构造一个对象,“DesignPatterns:ElementsofReusableObject-OrientedSoftware”(设计模式)ErichGamma、RichardHelm、RalphJohnson、JohnVlissidesAddison-Wesley,1995这几位作者常被称为“四人组(GangofFour)”,而这本书也就被称为“四人组(或GoF)”书设计模式:在一定的环境中解决某一问题的方案23种设计模式,3大类创建型模式(Creationalpattern)规定了创建对象的方式,如Singleton模式、FactoryMethod模式结构型模式(Structuralpattern)规定了如何组织类和对象。这些模式涉及类如何相互继承或如何从其它类组合,如Adapter、Proxy和Decorator模式行为模式(Behavioralpattern)规定了对象之间交互的方式。如Observer模式、Strategy和Template模式并发模式(Concurrencypattern)规定协调或顺序对共享资源访问的方式MVC(Model/View/Controller,模型/视图/控制器),设计模式的例子,publicclassSequenceprivatestaticSequenceinstance;privatestaticintcounter;privateSequence()counter=0;publicstaticsynchronizedSequencegetInstance()if(instance=null)instance=newSequence();returninstance;publicstaticsynchronizedintgetNext()return+counter;,这个类不可以再有子类,因为构造方法是privateLazyinstantiation(Lazyinitialization),仅在需要的时候才实例化对象,privatestaticSequenceinstance=newSequence();,第七讲对象和类(续),类的继承(extends)抽象类(abstractclass)静态变量的初始化接口(interface),接口是对abstract类的进一步扩展接口中的方法都是未实现的(类似于抽象方法),目的是在实现接口的类之间建立一种协议接口中的变量都是常量定义一个类符合某个或一组接口,利用implements,接口(interface),Aninterfaceisanamedcollectionofmethoddefinitions(withoutimplementations).Aninterfacecanalsodeclareconstants.,publicinterface接口名成员变量;方法声明;,class类名implements接口1,接口2,接口名修饰public:无任何访问限制无修饰:仅限于本包中接口变量默认都是“publicstaticfinal”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),接口(interface),接口方法无修饰但在实现接口方法的类中,修饰符为public,interfaceFiguredoublehalf=0.5,pi=3.14159;voidparameter();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.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();,接口(interface),接口的继承extends将多个接口合并为一个新的接口,interfaceDCintadd(intx,inty);interfaceDBextendsDCintsub(intx,inty);interfaceDAextendsDBintmul(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;,接口(interface),利用接口实现多重继承(Multipleinheritance)classextends父类implements接口,interfaceCanFightvoidfight();interfaceCanSwimvoidswim();interfaceCanFlyvoidfly();,classActionCharacterpublicvoidfight(),classHeroextendsActionCharacterimplementsCanFight,CanSwim,CanFlypublicvoidswim()publicvoidfly(),接口(interface),接口合并时的命名冲突,interfaceA1voidf();interfaceA2intf(inti);interfaceA3intf();,classCpublicintf()return4;,classC1implmentsA1,A2publicvoidf()publicintf(inti)return5;,classC2extendsCimplmentsA2publicintf(inti)return5;,classC3extendsCimplmentsA3publicintf()return5;,classC4extendsCimplementsA1,/overload,/overload,/implementsandoverriding,接口(interface),接口继承中的命名冲突,interfaceBaseColorsintRED=1,GREEN=2,BLUE=4;interfaceRainbowColorsextendsBaseColorsintYELLOW=3,ORANGE=5,VIOLET=6;interfacePrintColorsextendsBaseColorsintYELLOW=8,CYAN=16,MAGENTA=32;interfaceLotsOfColorsextendsRainbowColors,PrintColorsintFUCHSIA=17,CHARTREUSE=RED+90;,classDDimplementsLotsOfColorspublicstaticvoidmain(Stringargs)System.out.println(YELLOW);,classDDpublicstaticvoidmain(Stringargs)System.out.println(LotsOfColors.YELLOW);,referencetoYELLOWisambiguous,bothvariableYELLOWinRainbowColorsandvariableYELLOWinPrintColorsmatch,第七讲结束!,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!