您好,欢迎访问三七文档
8.1.1抽象类的定义abstractclass类名称{成员变量;方法(){……}//一般方法abstract方法();//抽象方法}•在抽象类中可以包含一般方法和抽象方法。•抽象类表示的是一个抽象概念,不能被实例化为对象。★8.1.2抽象类的应用•例8-1定义一个代表“形状”的抽象类,其中包括求形状面积的抽象方法。继承该抽象类定义三角型、矩形、圆。分别创建一个三角形、矩形、圆存入一个数组中,访问数组元素将各类图形的面积输出。abstractclassShape{//定义抽象类abstractpublicdoublearea();//抽象方法}★classTriangleextendsShape{//定义三角型privatedoublea,b,c;publicTriangle(doublea,doubleb,doublec){this.a=a;this.b=b;this.c=c;}publicdoublearea(){doublep=(a+b+c)/2;returnMath.sqrt(p*(p-a)*(p-b)*(p-c));}}三角型★定义矩形classRectangleextendsShape{//定义矩形privatedoublewidth,height;publicRectangle(doublej,doublek){width=j;height=k;}publicdoublearea(){returnwidth*height;}}定义圆classCircleextendsShape{//定义圆privatedoubler;publicCircle(doubler){this.r=r;}publicdoublearea(){return3.14*r*r;}}publicclassTest{publicstaticvoidmain(Stringargs[]){Shapes[]=newShape[3];s[0]=newTriangle(25,41,50);s[1]=newRectangle(15,20);s[2]=newCircle(47);for(intk=0;ks.length;k++)System.out.println(s[k].area());}}★8.2.1接口定义[public]interface接口名[extends父接口名列表]{[public][static][final]域类型域名=常量值;[public][abstract]返回值方法名(参数列表)[throw异常列表];}•声明接口可给出访问控制符;•一个接口还可以继承多个父接口,父接口间用逗号分隔。•系统默认接口中所有属性的修饰都是publicstaticfinal;•系统默认接口中所有方法的修饰都是publicabstract。★接口定义举例interfaceCopyable{Objectcopy();}★8.2.2接口的实现classBookimplementsCopyable{Stringbook_name;//书名Stringbook_id;//书号publicBook(Stringname,Stringid){book_name=name;book_id=id;}publicObjectcopy(){returnnewBook(book_name,book_id);}….★是否可为Book类型8.2.2接口的实现(续)publicStringtoString(){return书名:+book_name+,书号=+book_id;}publicstaticvoidmain(String[]args){Bookx=newBook(Java程序设计,ISBN8359012);System.out.println(x);System.out.println(x.copy());Booky=(Book)x.copy();System.out.println(y);}}★有关接口的实现,要注意以下问题•一个类可以实现多个接口。接口间用逗号分隔;•如果实现某接口的类不是抽象类,则在类的定义部分必须实现指定接口的所有抽象方法;•换句话说,实现某接口的类必须用具体方法覆盖掉接口中定义的抽象方法;•接口的抽象方法的访问限制符默认为public,在实现时要在方法头中显式地加上public修饰。★二义性问题interfaceFrob{floatv=2.0f;}//接口定义classParent{intv=3;}//父类定义classTestextendsParentimplementsFrob{publicstaticvoidmain(String[]args){newTest().printV();}voidprintV(){System.out.println((super.v+Frob.v)/2);}}8.3内嵌类publicclassOuterOne{privateintx=3;privateinty=4;publicvoidOuterMethod(){InnerOneino=newInnerOne();ino.innerMethod();}publicclassInnerOne{//内嵌类privateintz=5;intx=6;publicvoidinnerMethod(){System.out.println(yis+y);System.out.println(zis+z);System.out.println(x=+x);System.out.println(this.x=+this.x);System.out.println(OuterOne.this.x=+OuterOne.this.x);}}内嵌类可以访问外部类的成员例8-3一个简单例子★有关说明•内嵌类经过编译后产生的字节码文件名为:OuterOne$InnerOne.class•在内嵌类中可以访问外层类的成员•内嵌类可以使用访问控制符public、protected、private修饰在main方法中间接创建内嵌类的对象•在main方法中,要创建内嵌类的对象必须先创建外层类对象,然后通过外层类对象创建内嵌类对象。例如:publicstaticvoidmain(Stringarg[]){OuterOne.InnerOnei=newOuterOne().newInnerOne();i.innerMethod();}例8-4静态内嵌类举例publicclassOutertwo{privatestaticintx=3;privateinty=5;publicstaticclassInnertwo{//静态内嵌类publicstaticvoidMethod(){System.out.println(xis+x);}publicvoidMethod2(){System.out.println(xis+x);}}//内嵌类结束publicstaticvoidmain(Stringarg[]){Outertwo.Innertwo.Method();newOutertwo.Innertwo().Method2();}}方法中的内嵌类publicclassOuterTwo{privateintx=3;publicvoidOuterMethod(intm){finalintn=x+2;classInnerTwo{//方法内的内嵌类privateinty=5;publicvoidinnerMethod(){System.out.println(yis+y);System.out.println(nis+n);System.out.println(xis+x);}}//内嵌类结束只能访问外部方法中的常量(带final修饰)方法中的内嵌类InnerTwoin2=newInnerTwo();in2.innerMethod();}publicstaticvoidmain(Stringarg[]){OuterTwomy=newOuterTwo();my.OuterMethod(8);}}【例8-5】匿名内嵌类的使用。interfacesample{voidtestMethod();}publicclassAnonymousInner{voidOuterMethod(){newsample(){publicvoidtestMethod(){System.out.println(justtest);}}.testMethod();//调用内嵌类中定义的方法}---字节码文件为AnonymousInner$1.class。如果有更多的匿名内嵌类将按递增序号命名由接口派生匿名内嵌类,根据该内嵌类创建对象上机题•定义接口Shape,其中包括一个方法size(),设计“矩形”、“圆”、“圆柱体”等类实现Shape接口,其size()方法分别表示计算矩形面积、圆面积、圆柱体的体积。分别创建代表“矩形”、“圆”、“圆柱体”的三个对象存入一个Shape类型的数组中,通过调用size()方法将数组中各类图形的大小输出。•定义一个抽象类-水果,其中包括getWeight()方法,编写程序分别创建苹果、桃子、橘子三个类,创建若干水果对象存放在一个水果类型的数组中,输出数组中所有水果的类型、重量。提示:利用对象的getClass().getName()方法可获取对象的所属类的名称。
本文标题:8同上
链接地址:https://www.777doc.com/doc-3126218 .html