《序设计方式来构建一套属于自己的图形环境该怎么做呢》由会员分享,可在线阅读,更多相关《序设计方式来构建一套属于自己的图形环境该怎么做呢(34页珍藏版)》请在金锄头文库上搜索。
1、第四章第四章抽象类和接口抽象类和接口假假设设我我们们要要用用面面向向对对象象的的程程序序设设计计方方式式来来构构建建一一套套属属于自己的图形环境,该怎么做呢?于自己的图形环境,该怎么做呢?首首先先,假假设设我我们们的的图图形形环环境境中中出出现现的的所所有有的的图图形形都都是是简简单单图图形形,它它们们可可以以圆圆形形、三三角角形形、正正方方形形或或者者其其他他的多边形。的多边形。因因为为这这里里定定义义的的环环境境是是一一个个坐坐标标系系统统,任任何何一一个个图图形形在在这这个个坐坐标标系系统统里里自自然然都都有有它它的的位位置置,所所以以我我们们可可以以先定义出一个基础类,再给其他的类继承
2、。先定义出一个基础类,再给其他的类继承。classShapeintx,y;voidMoveTo(intnewx,newy)x=newx;y=newy;而而对对于于各各个个图图形形,我我们们则则可可以以定定义义不不同同的的类类去去继继承承它它。例如:例如:classSquareextendsShapeintlength;voidDraw()System.out.println(我是正方形我是正方形);classCircleextendsShapeintr;/以以(x,y)为中心,画出一个边长是为中心,画出一个边长是length的正方形的正方形voidDraw()System.out.printl
3、n(我是圆形我是圆形);/以以(x,y)为为中中心心,画画出出一一个个半半径径是是r的的圆圆形形现在问题来了,看看下面会发生什么?现在问题来了,看看下面会发生什么?classShapeManagervoidmanage(Shapeobj)obj.Draw();publicclassDemopublicstaticvoidmain(Stringargs)ShapeManagershape_man=newShapeManager();Squaresq=newSquare();Circleci=newCircle();shape_man.manage(sq);shape_man.manage(ci)
4、;当当程程序序在在编编译译时时,会会因因为为Shape中中并并没没有有Draw这这个个方方法而造成编译错误。于是最好这样做:法而造成编译错误。于是最好这样做:classShapeintx,y;voidMoveTo(intnewx,intnewy)x=newx;y=newy;voidDraw();这这样样以以来来,含含有有abstract所所修修饰饰的的方方法法的的类类也也就就自自动动变成抽象类了。变成抽象类了。abstractabstract抽象类抽象类(abstractclass)就是用修饰符就是用修饰符abstract修修饰的类。在抽象类中,可以定义用修饰符饰的类。在抽象类中,可以定义用修
5、饰符abstract修修饰的抽象方法。饰的抽象方法。抽抽象象方方法法只只是是一一个个定定义义,不不能能有有具具体体实实现现的的方方法法。通通常常抽抽象象类类不不具具备备实实际际功功能能,只只用用来来派派生生子子类类。抽抽象象方方法也必须在子类中被抑制法也必须在子类中被抑制(overriding)。抽抽象象类类的的唯唯一一目目的的是是为为子子类类提提供供公公有有信信息息,它它是是用用来来被继承的,被继承的,抽象类不能创建对象。抽象类不能创建对象。51抽象类抽象类一、定义一、定义abstractpublicclassShapeabstractpublicvoidDraw();在在此此抽抽象象类类中
6、中定定义义了了抽抽象象方方法法Draw(),这这样样所所有有从从Shape中派生的类都必须实现这个中派生的类都必须实现这个Draw()方法。方法。二、应用示例二、应用示例例子一:抽象类的使用程序例子一:抽象类的使用程序(AbstractClass.java)importjava.awt.*;importjava.applet.*;abstractclassShapepublicintx,y;publicintwidth,height;publicShape(intx,inty,intwidth,intheight)/一个构造方法,在抽象类中也可以有常规的方法一个构造方法,在抽象类中也可以有常规
7、的方法this.x=x;this.y=y;this.width=width;this.height=height;abstractdoublegetArea();/抽象方法只能在抽象类中存在抽象方法只能在抽象类中存在abstractdoublegetPerimeter();classSquareextendsShapepublicdoublegetArea()/必须在子类中抑制抽象超类的方必须在子类中抑制抽象超类的方法法return(width*height);publicdoublegetPerimeter()/在子类中抑制抽象超类的方在子类中抑制抽象超类的方法法return(2*width
8、+2*height);Square(intx,inty,intwidth,intheight)/构造方法构造方法super(x,y,width,height);classCircleextendsShapepublicdoubler;publicdoublegetArea()/抑制抽象超类的方法抑制抽象超类的方法return(r*r*Math.PI);publicdoublegetPerimeter()/抑制抽象超类的方法抑制抽象超类的方法return(2*Math.PI*r);Circle(intx,inty,intwidth,intheight)/构造方法构造方法super(x,y,wid
9、th,height);r=(double)width/2.0;publicclassAbstractClassextendsAppletSquareBox=newSquare(5,l5,20,20);CircleOval=newCircle(5,50,20,20);publicvoidpaint(Graphicsg)g.drawRect(Box.x,Box.y,Box.width,Box.height);g.drawString(Area:+Box.getArea(),50,35);g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height);g.drawS
10、tring(Area:+Oval.getArea(),50,70);例子二:抽象类的使用例子二:抽象类的使用程序程序(AbstractProduct.java)importjava.awt.*;importjava.applet.*;abstractclassProductdoublePrice,Cost;StringName;publicProduct(StringName,doublePrice,doubleCost)this.Name=Name;this.Price=Price;this.Cost=Cost;publicabstractStringShowProduct();classB
11、ookextendsProductpublicBook(StringTitle,doublePrice,doubleCost)super(Title,Price,Cost);publicStringShowProduct()return(Book:+Name+Price:$+Price);classCDROMextendsProductpublicCDROM(StringTitle,doublePrice,doubleCost)super(Title,Price,Cost);publicStringShowProduct()return(CD-ROM:+Name+Price:$+Price);
12、publicclassAbstractProductextendsAppletBookJavaBook=newBook(JavaProgramming.,39,30);CDROMJavaLibrary=newCDROM(JavaProgrammersLibrary.,49.95,39.95);publicvoidpaint(Graphicsg)g.drawString(JavaBook.ShowProduct(),5,l5);g.drawString(JavaLibrary.Showproduct(),5,45);本程序的本程序的.html文件为文件为:运行结果为:运行结果为:Book:Jav
13、aProgramming.Price:$39CD-ROM:JavaProgrammersLibrary.Price:$49.955.2接口接口一、为什么要使用接口?一、为什么要使用接口?可可以以将将接接口口理理解解为为一一个个严严格格定定义义的的抽抽象象类类。接接口口是是一一组抽象方法的定义和在类间共享它们的一种方式。组抽象方法的定义和在类间共享它们的一种方式。类继承对于重用超类中的代码很有用,而类继承对于重用超类中的代码很有用,而Java只支只支持单继承持单继承,在遇到需要多继承的情况,可以通过接口,在遇到需要多继承的情况,可以通过接口来帮助实现。(多态性)来帮助实现。(多态性)接接口口的的
14、使使用用是是java的的OOP概概念念中中的的“多多态态性性”的的一一种种表现。表现。例如:例如:类类A类类B类类C吃早餐吃早餐(三明治三明治);吃早餐吃早餐(喝咖啡喝咖啡);吃早餐吃早餐(三明治三明治);吃午餐吃午餐(吃面条吃面条);吃午餐吃午餐(吃苹果吃苹果);吃午餐吃午餐(吃西餐吃西餐);吃晚餐吃晚餐(吃牛排吃牛排);吃晚餐吃晚餐(麦当劳麦当劳);吃晚餐吃晚餐(自助餐自助餐);接口是一组抽象行为,其可以结接口是一组抽象行为,其可以结合到任何类,可以把行为添加到合到任何类,可以把行为添加到没有被超类提供的类中。没有被超类提供的类中。综合为接口:综合为接口:接口接口一日三餐一日三餐吃早餐()
15、吃早餐();吃午餐()吃午餐();吃晚餐()吃晚餐();53接口的定义及其使用接口的定义及其使用一、定义一、定义接接口口是是一一组组抽抽象象方方法法定定义义和和常常量量的的集集合合,在在接接口口中中没没有提供方法的实现。有提供方法的实现。Java的的接接口口是是为为相相互互没没有有关关系系的的类类实实现现同同样样的的一一组组方方法而提供的一种手段。法而提供的一种手段。接口是用来被使用的。接口是用来被使用的。定义方法为:定义方法为:publicinterface接口名接口名成成员员变变量量:但但它它们们必必须须是是说说明明为为public,static和和final的常量。的常量。成成员员方方法
16、法:这这些些方方法法不不能能够够有有方方法法体体。如如同同抽抽象象方方法法一一样样,是是用用publicabstract修修饰饰的的方方法法。默默认认为为public。说明:说明:(1)象象在在类类中中用用abstract方方法法一一样样,在在接接口口内内的的方方法法不能具有方法体,一个接口是纯设计,不包含实现。不能具有方法体,一个接口是纯设计,不包含实现。(2)用用户户必必须须在在自自己己的的类类中中对对接接口口中中的的所所有有方方法法进进行行说说明明;子子类类可可以以直直接接继继承承使使用用接接口口的的超超类类中中的的各各种种方方法,并能够超越(抑制)或重载它们。法,并能够超越(抑制)或重
17、载它们。二、二、接口与抽象类的差别接口与抽象类的差别按照类的按照类的封装概念封装概念接接口口抽抽象象类类变量变量常量:必须同时使用常量:必须同时使用public,static和和final3个修饰符个修饰符没有限制没有限制方法方法所有方法只能被声明而不能所有方法只能被声明而不能被定义,并且都是被定义,并且都是public的的至少有一个方法只被至少有一个方法只被声明而没有被定义声明而没有被定义用途用途被使用被使用被继承被继承例如:例如:publicinterfaceShapepublicabstractvoiddraw(Graphicg);publicinterfaceRectextendsSh
18、apepublicabstractvoidsetSize(Dimensionsize);publicabstractDimensiongetSize();三、使用接口三、使用接口用用implements关键字在类的定义中使用接口关键字在类的定义中使用接口例如例如:public classmyappletextendsAppletimplementsmyInterface类体类体四、一个实现四、一个实现Java接口的例子接口的例子importjava.awt.*;importjava.applet.*;publicinterfaceShape/定义接口定义接口abstractdoublegetA
19、rea();abstractdoublegetPerimeter();classCoordinates/定义类定义类Coordinatesintx,y;Coordinates(intx,inty)/构造方法构造方法this.x=x;this.y=y;classSquareextendsCoordinatesimplementsShapes/定义类定义类Coordinates的子类的子类Square,并且实现接口并且实现接口Shapepublicintwidth,height;publicdoublegetArea()return(width*height);/实现接口中的方法,它实现接口中的方
20、法,它必须是必须是public的的publicdoublegetPerimeter()return(2*width+2*height);Square(intx,inty,intwidth,intheight)/构造方法构造方法super(x,y);/调用超类的构造方法调用超类的构造方法this.width=width;this.height=height;/类类Square定义结束定义结束classCircleextendsCoordinatesimplementsShapes/定定义义类类Coordinates的的子子类类Circle,并并且且实实现现接接口口publicintwidth,h
21、eight;publicdoubler;publicdoublegetArea()/在使用接口的类中要显示表示在使用接口的类中要显示表示publicreturn(r*r*Math.PI);publicdoublegetPerimeter()/实现接口中的方法实现接口中的方法return(2*r*Math.PI);publicCircle(intx,inty,intwidth,intheight)/构造方法构造方法super(x,y);this.width=width;this.height=height;r=(double)width/2.0;/类类Circle定义结束定义结束publiccl
22、assExtendAndImplementextendsAppletSquareBox=newSquare(5,15,25,25);CircleOval=newCircle(5,50,25,25);publicvoidpaint(Graphicsg)g.drawRect(Box.x,Box.y,Box.width,Box.height);g.drawString(“Area:”+Box.getArea(),50,35);g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height);g.drawString(“Area:”+Oval.getArea(),50,
23、70);使用接口的好处:使用接口的好处:1先定义一个抽象类的协议而不管其具体实现。先定义一个抽象类的协议而不管其具体实现。2多多个个类类可可共共享享相相同同的的接接口口,相相互互间间不不用用管管其其它它类类是是如如何何定定义义该该接接口口的的方方法法。如如果果你你使使用用了了接接口口,其其它它用用户就可以了解到如何调用这个类的方法。户就可以了解到如何调用这个类的方法。类类爷爷爷爷类类奶奶奶奶类类爸爸爸爸类类妈妈妈妈聪明聪明谦虚谦虚幽默幽默善良善良class小小威威extends爸爸爸爸幽默幽默java不支持多继承,所以小不支持多继承,所以小威威不能不能用多继承的方式继用多继承的方式继承大家的优
24、点:承大家的优点:class小威小威 extends爸爸,妈妈,爷爷,奶奶爸爸,妈妈,爷爷,奶奶3、间接实现对类的多重继承作用、间接实现对类的多重继承作用interface遗传遗传聪明;聪明;/爷爷的优点爷爷的优点谦虚;谦虚;/奶奶的优点奶奶的优点善良;善良;/妈妈的优点妈妈的优点class小威小威extends爸爸爸爸implements遗传遗传/完美的小威完美的小威但是他却可以通过接口来达到目的:但是他却可以通过接口来达到目的:接口回调是指:可以把接口回调是指:可以把使用某一接口类使用某一接口类创建的对象的引创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以用赋给该接口声明的接
25、口变量,那么该接口变量就可以调用被类实现的接口中的方法。调用被类实现的接口中的方法。当接口变量调用被类实现的接口中的方法时,就是当接口变量调用被类实现的接口中的方法时,就是通知通知相应的对象调用接口的方法。相应的对象调用接口的方法。例子:例子:P78例子例子 4.2854 接口回调接口回调interfaceShowMessagevoid显示商标显示商标(Strings);/接口中的方法默认都是接口中的方法默认都是publicclassTVimplementsShowMessagepublicvoid显示商标显示商标(Strings)/在使用接口的类中要显示表示在使用接口的类中要显示表示publ
26、icSystem.out.println(s);classPCimplementsShowMessagepublicvoid显示商标显示商标(Strings)System.out.println(s);publicclassEXAMPpublicstaticvoidmain(Stringargs)ShowMessagesm;/声明接口变量声明接口变量sm=newTV();/接口变量中存放对象的引用接口变量中存放对象的引用sm.显示商标显示商标(“熊猫电视熊猫电视”);/接口回调接口回调sm=newPC();/接口变量中存放对象的引用接口变量中存放对象的引用sm.显示商标显示商标(“IBMPC”);/接口回调接口回调