您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 股票经典资料 > 4_3非访问控制-接口-内部类
1第4章继承与多态Part3非访问控制符、接口内部类与匿名类2本章内容非访问控制符Java类的static成员final关键字abstract关键字(抽象类)接口内部类与匿名类3非访问控制符非访问控制符基本定义修饰类修饰成员修饰局部变量static静态、类、非实例只可以修饰内部类YesNofinal最终的、不可变的YesYesYesabstract抽象的、不可实例化的Yes只有方法No4关键字static在Java类中声明变量、方法和内部类时,可使用关键字static做为修饰符。static标记的变量或方法由整个类(所有实例)共享,如果访问控制权限允许,可不必创建该类对象而直接用类名加‘.’调用。static成员也称类成员或静态成员,如:类属性、类方法、静态方法等。5类属性(classAttributes)类属性由该类的所有实例共享publicclassPerson{privateintid;publicstaticinttotal=0;publicPerson(){total++;id=total;}}Person+total:int=0-id:intp1:Personid=1p2:Personid=2instanceOfinstanceOf6类属性应用举例classPerson{privateintid;publicstaticinttotal=0;publicPerson(){total++;id=total;}}publicclassOtherClass{publicstaticvoidmain(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)classPerson{privateintid;privatestaticinttotal=0;publicstaticintgetTotalPerson(){returntotal;}publicPerson(){total++;id=total;}}publicclassTestPerson{publicstaticvoidmain(String[]args){System.out.println(Numberoftotalis+Person.getTotalPerson());Personp1=newPerson();System.out.println(Numberoftotalis+Person.getTotalPerson());}}Theoutputis:Numberoftotalis0Numberoftotalis110类方法应用举例(2)classWrong{intx;voidmethod(){}publicstaticvoidmain(String[]args){//编译错误x=9;method();}}11静态初始化器classPerson{publicstaticinttotal;static{total=100;//为total赋初值}……//其它属性或方法声明}由static{…}构成,在类的定义体中、方法的外部可包含static语句块。static语句块仅在其所属的类被载入时执行一次static块通常用于初始化static(类)属性如果有多个static块,在类的初始化时会依次执行。12静态初始化举例Person.javaclassPerson{publicstaticinttotal;static{total=100;System.out.println(instaticblockone!);total++;}publicstaticvoidmain(String[]args){System.out.println(total=+Person.total);System.out.println(total=+Person.total);}static{System.out.println(instaticblockTwo!);}}13static的应用模型Singleton设计模板(单子)classSingle{privatestaticSingleonlyone=newSingle();publicstaticSinglegetSingle(){returnonlyone;}privateSingle(){}}publicclassTestSingle{publicstaticvoidmain(Stringargs[]){Singles1=Single.getSingle();Singles2=Single.getSingle();if(s1==s2){System.out.println(s1isequalstos2!);}}}14static与继承子类不能继承父类中的static成员子类可以定义与父类的static变量同名的变量子类不能定义与父类static方法同名的成员方法;但是子类可以定义与父类static方法同名的static方法父类的非静态方法不能被子类覆盖为静态注意与访问控制符的结合15static与继承举例Father.javapublicclassFather{staticinti=1;staticvoidmethod(){}}classSonextendsFather{inti=1;//合法voidmethod(){}//非法staticvoidmethod(){}//合法!注意访问控制符}举例:B.java16动态绑定访问一个引用型的变量的非静态方法,运行时与实际引用的对象的方法绑定。访问一个引用型的变量的静态方法,运行时与声明的类的方法绑定。17关键字finalFinal.java在Java中声明类、属性和方法时,可使用关键字final来修饰。表示“最终”“不可变”。final标记的类不能被继承。final不可与protected同用。final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。final常与static一起表示多个对象的公有常量。final标记的成员变量必须在声明的同时或在每个构造方法中显式赋值,然后才能使用。final标记的方法不能被子类重写(不能编译)。此处与private标记的方法不同。18关键字final应用举例importjava.io.*;publicfinalclassTest{publicstaticinttotalNumber=5;publicfinalintid;publicTest(){id=++totalNumber;}publicstaticvoidmain(String[]args){Testt=newTest();System.out.println(t.id);finalinti=10;finalintj;j=20;j=30;//非法}}19Ex1使用static和final关键字1.体会static关键字的用法;2.阅读下述程序,并改正其错误,体会final关键字修饰变量时的用法;publicclassTestFinal{publicstaticvoidmain(Stringargs[]){inti=1;finalintj=10;j=100;finalintk;k=100;k=200;System.out.println(i=+i+j=+j+k=+k);}}20abstract关键字abstract可以修饰类、方法。表示抽象,“无法实例化”、“没有具体化”。abstract不能与final并列修饰同一类abstract不能与private,static,final或并列修饰同一方法。abstract方法必须位于abstract类中。21抽象类(abstractclass)用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。含有抽象方法的类必须被声明为抽象类。抽象类不能被实例化(须说明)。抽象方法只需声明,无方法体。abstractreturnTypemethodName([paramlist]);例如:abstractclassA{abstractvoidmethod(inta);}22抽象类的继承抽象类(抽象方法)是为继承而设计的。子类继承父类(抽象类),则子类应重写父类所有的抽象方法,称为“实现”。子类如果没有实现某一抽象方法,则子类也应声明为抽象类,否则编译错误。没有抽象构造方法。(抽象类可以有构造函数)23抽象类举例abstractclassA{abstractvoidm1();publicvoidm2(){System.out.println(A类中定义的m2方法);}}classBextendsA{voidm1(){System.out.println(B类中定义的m1方法);}}publicclassTest{publicstaticvoidmain(Stringargs[]){Ac=newB();//抽象例实例化的特例c.m1();c.m2();}}24抽象方法的覆盖子类可以定义抽象方法覆盖父类抽象方法。父类的非抽象方法可以被覆盖为抽象方法。publicclassXixi{finalinta=5;voidb(){};}abstractclasshahaextendsXixi{finalinta=5;abstractvoidb();}抽象应用举例:TestVirtualInvoke.java25假设有若干个Circle,以及若干个Rectangle,希望计算它们的总面积,直截了当的做法是将它们分别放到两个数组中,用两个循环,加上一个加法,这种做法是不漂亮的如果还有其它形状,triangle,ellipses等,上述方法显得“累赘”,我们希望有一种统一的表示,例如用一个数组shape[],接受所有的形状,然后用for(i=0;ishape.length;i++){area_total+=shape[i].area();26abstractclassShape{abstractfloatarea();}classCircleextendsShape{publicintr;Circle(intr){this.r=r;}publicfloatarea(){return3.14f*r*r;}}classRectangleextendsShape{publicintwidth,height;Rectangle(intw,inth){width=w;height=h;}publicfloatarea(){returnwidth*height;}}27接口(1)接口(interface)是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口定义举例publicinterfaceRunner{intid=1;publicvoidstart();publicvoidrun();publicvoidstop();}接口同class一样,保存在.java文件中
本文标题:4_3非访问控制-接口-内部类
链接地址:https://www.777doc.com/doc-1120735 .html