非访问控制接口内部类_第1页
非访问控制接口内部类_第2页
非访问控制接口内部类_第3页
非访问控制接口内部类_第4页
非访问控制接口内部类_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第4章继承与多态,Part3非访问控制符、接口内部类与匿名类,2,本章内容,非访问控制符Java类的static成员final关键字abstract关键字(抽象类)接口内部类与匿名类,3,非访问控制符,4,关键字static,在Java类中声明变量、方法和内部类时,可使用关键字static做为修饰符。static标记的变量或方法由整个类(所有实例)共享,如果访问控制权限允许,可不必创建该类对象而直接用类名加.调用。static成员也称类成员或静态成员,如:类属性、类方法、静态方法等。,5,类属性(classAttributes),类属性由该类的所有实例共享,publicclassPersonprivateintid;publicstaticinttotal=0;publicPerson()total+;id=total;,6,类属性应用举例,classPersonprivateintid;publicstaticinttotal=0;publicPerson()total+;id=total;publicclassOtherClasspublicstaticvoidmain(Stringargs)Person.total=100;System.out.println(Person.total);Personc=newPerson();System.out.println(Person.total);,7,类变量与实例变量的区别,类变量与类绑定在一起,实例变量与实例绑定在一起。类变量在内存中只有一个拷贝,运行时只为类变量分配一次内存。对于实例变量,每创建一个实例,就为该实例分配一次内存。类变量被所有的实例共享。,8,类方法,static标记的方法由整个类(所有实例)共享,如果访问控制权限允许,可不必创建该类对象而直接用类名加.调用。类方法中不能访问实例变量。在类方法中不能使用this和super。static方法只能处理类变量,或者调用类方法。但是实例方法中可以处理类变量,调用类方法。static方法不能修饰成abstract。,9,类方法应用举例(1),classPersonprivateintid;privatestaticinttotal=0;publicstaticintgetTotalPerson()returntotal;publicPerson()total+;id=total;publicclassTestPersonpublicstaticvoidmain(Stringargs)System.out.println(Numberoftotalis+Person.getTotalPerson();Personp1=newPerson();System.out.println(Numberoftotalis+Person.getTotalPerson();,Theoutputis:Numberoftotalis0Numberoftotalis1,10,类方法应用举例(2),classWrongintx;voidmethod()publicstaticvoidmain(Stringargs)/编译错误x=9;method();,11,静态初始化器,classPersonpublicstaticinttotal;statictotal=100;/为total赋初值/其它属性或方法声明由static构成,在类的定义体中、方法的外部可包含static语句块。static语句块仅在其所属的类被载入时执行一次static块通常用于初始化static(类)属性如果有多个static块,在类的初始化时会依次执行。,12,静态初始化举例Person.java,classPersonpublicstaticinttotal;statictotal=100;System.out.println(instaticblockone!);total+;publicstaticvoidmain(Stringargs)System.out.println(total=+Person.total);System.out.println(total=+Person.total);staticSystem.out.println(instaticblockTwo!);,13,static的应用模型Singleton设计模板(单子),classSingleprivatestaticSingleonlyone=newSingle();publicstaticSinglegetSingle()returnonlyone;privateSingle()publicclassTestSinglepublicstaticvoidmain(Stringargs)Singles1=Single.getSingle();Singles2=Single.getSingle();if(s1=s2)System.out.println(s1isequalstos2!);,14,static与继承,子类不能继承父类中的static成员子类可以定义与父类的static变量同名的变量子类不能定义与父类static方法同名的成员方法;但是子类可以定义与父类static方法同名的static方法父类的非静态方法不能被子类覆盖为静态注意与访问控制符的结合,15,static与继承举例Father.java,publicclassFatherstaticinti=1;staticvoidmethod()classSonextendsFatherinti=1;/合法voidmethod()/非法staticvoidmethod()/合法!注意访问控制符举例:B.java,16,动态绑定,访问一个引用型的变量的非静态方法,运行时与实际引用的对象的方法绑定。访问一个引用型的变量的静态方法,运行时与声明的类的方法绑定。,17,关键字finalFinal.java,在Java中声明类、属性和方法时,可使用关键字final来修饰。表示“最终”“不可变”。final标记的类不能被继承。final不可与protected同用。final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。final常与static一起表示多个对象的公有常量。final标记的成员变量必须在声明的同时或在每个构造方法中显式赋值,然后才能使用。final标记的方法不能被子类重写(不能编译)。此处与private标记的方法不同。,18,关键字final应用举例,importjava.io.*;publicfinalclassTestpublicstaticinttotalNumber=5;publicfinalintid;publicTest()id=+totalNumber;publicstaticvoidmain(Stringargs)Testt=newTest();System.out.println(t.id);finalinti=10;finalintj;j=20;j=30;/非法,19,Ex1使用static和final关键字,体会static关键字的用法;阅读下述程序,并改正其错误,体会final关键字修饰变量时的用法;publicclassTestFinalpublicstaticvoidmain(Stringargs)inti=1;finalintj=10;j=100;finalintk;k=100;k=200;System.out.println(i=+i+j=+j+k=+k);,20,abstract关键字,abstract可以修饰类、方法。表示抽象,“无法实例化”、“没有具体化”。abstract不能与final并列修饰同一类abstract不能与private,static,final或并列修饰同一方法。abstract方法必须位于abstract类中。,21,抽象类(abstractclass),用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。含有抽象方法的类必须被声明为抽象类。抽象类不能被实例化(须说明)。抽象方法只需声明,无方法体。abstractreturnTypemethodName(paramlist);例如:abstractclassAabstractvoidmethod(inta);,22,抽象类的继承,抽象类(抽象方法)是为继承而设计的。子类继承父类(抽象类),则子类应重写父类所有的抽象方法,称为“实现”。子类如果没有实现某一抽象方法,则子类也应声明为抽象类,否则编译错误。没有抽象构造方法。(抽象类可以有构造函数),23,抽象类举例,abstractclassAabstractvoidm1();publicvoidm2()System.out.println(A类中定义的m2方法);classBextendsAvoidm1()System.out.println(B类中定义的m1方法);publicclassTestpublicstaticvoidmain(Stringargs)Ac=newB();/抽象例实例化的特例c.m1();c.m2();,24,抽象方法的覆盖,子类可以定义抽象方法覆盖父类抽象方法。父类的非抽象方法可以被覆盖为抽象方法。publicclassXixifinalinta=5;voidb();abstractclasshahaextendsXixifinalinta=5;abstractvoidb();抽象应用举例:TestVirtualInvoke.java,25,假设有若干个Circle,以及若干个Rectangle,希望计算它们的总面积,直截了当的做法是将它们分别放到两个数组中,用两个循环,加上一个加法,这种做法是不漂亮的如果还有其它形状,triangle,ellipses等,上述方法显得“累赘”,我们希望有一种统一的表示,例如用一个数组shape,接受所有的形状,然后用for(i=0;ishape.length;i+)area_total+=shapei.area();,26,abstractclassShapeabstractfloatarea();classCircleextendsShapepublicintr;Circle(intr)this.r=r;publicfloatarea()return3.14f*r*r;classRectangleextendsShapepublicintwidth,height;Rectangle(intw,inth)width=w;height=h;publicfloatarea()returnwidth*height;,27,接口(1),接口(interface)是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口定义举例publicinterfaceRunnerintid=1;publicvoidstart();publicvoidrun();publicvoidstop();接口同class一样,保存在.java文件中,编译后可生成.class文件,28,接口(2),声明接口的语法如下:publicinterface接口名extends父接口名列表(多个)/常量域声明,修饰符默认,必须被赋初值publicstaticfinal域类型域名=常量;/抽象方法声明,修饰符默认publicabstract返回值方法名(参数列表);,29,接口(3),多个无关的类可以实现同一个接口一个类可以实现多个无关的接口与继承关系类似,接口与实现类之间存在多态性实现接口的Java类的语法格式:classextendsimplements,*接口的抽象方法的访问限制符都已指定为public,所以类在实现方法时,必须显式地使用public修饰符。,30,接口应用举例(1),publicinterfaceRunnerpublicvoidstart();publicvoidrun();publicvoidstop();publicclassPersonimplementsRunnerpublicvoidstart()/准备工作:弯腰、蹬腿、咬牙、瞪眼/开跑publicvoidrun()/摆动手臂/维持直线方向publicvoidstop()/减速直至停止、喝水。,31,接口应用举例(2),32,接口应用举例(3),interfaceRunnerpublicvoidrun();interfaceSwimmerpublicdoubleswim();classAnimalpublicvoideat();/非法,为什么?classPersonextendsAnimalimplementsRunner,Swimmerpublicvoidrun()publicdoubleswim()publicvoideat()publicclassTestInterfacepublicstaticvoidmain(Stringargs)TestInterfacet=newTestInterface();Personp=newPerson();t.m1(p);t.m2(p);t.m3(p);publicvoidm1(Runnerf)f.run();publicvoidm2(Swimmers)s.swim();publicvoidm3(Animala)a.eat();,33,接口(4)TestInterface.java,如果实现某接口的类不是abstract类,则在类的定义中必须实现指定接口的所有抽象方法(所有的)如果,某类只实现了某接口的部分方法,那么此类必须被定义为abstractAdapter适配器,34,接口用法总结,通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。通过接口可以指明多个类需要实现的方法。通过接口可以了解对象的交互界面,而不需了解对象所对应的类。,35,内部类,在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类Innerclass一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。Innerclass的名字不能与包含它的类名相同;内部类和外层封装它的类之间存在逻辑上的所属关系Innerclass可以使用包含它的类的静态和实例成员变量;,36,内部类举例(1),classAprivateints;publicclassB/innerclasspublicvoidmb()s=100;System.out.println(在内部类B中s=+s);publicvoidma()Bi=newB();i.mb();publicclassTestpublicstaticvoidmain(Stringargs)Ao=newA();o.ma();,37,内部类举例(2),publicclassAprivateints;publicclassBpublicvoidmb()System.out.println(s);publicclassTestpublicstaticvoidmain(Stringargs)Aa=newA();/创建一个依赖于a而存在的bA.Bb=a.newB();b.mb();,栈内存,a,B类对象,0,A类对象,s,b,this,堆内存,处内存状态,main,mb,A.this,38,内部类举例(3),publicclassAprivateints=11

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论