您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 第5章 类的高级特性
清华大学出版社JavaEE基础教程第5章类的高级特性5.1static关键字5.2this关键字5.3静态导入5.4final关键字5.5抽象类与接口JavaEE基础教程22011年9月23日星期五返回5.1static关键字static关键字用来声明静态变量和静态方法。例如:classMyClass{staticinti;staticvoidincrease(){i++;}}静态变量和静态方法为类中所有对象所共有,可以不创建对象,直接引用。也称为类变量和类方法。引用方式:类名.静态变量/静态方法,如:MyClass.i;MyClass.increase();如果在声明时不用static关键字修饰,则为实例变量和实例方法。JavaEE基础教程32011年9月23日星期五一个类通过使用new运算符可以创建多个不同的对象,这些对象将被分配不同的内存空间,准确地说就是不同的对象的实例变量将被分配不同的内存空间,如果类中的成员变量有类变量,那么所有的对象的这个类变量都分配给相同的一处内存。也就是说对象共享类变量,改变其中一个对象的这个类变量会影响其它对象的这个类变量。静态变量可以通过类名直接访问,也可以通过对象来调用。采用这两种方法取得的结果是相同的。如果是public静态变量,则其它类可以不通过实例化访问它们。类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可由实例对象进行调用。类方法中不能使用this或super关键字。JavaEE基础教程42011年9月23日星期五对于实例变量必须先生成实例对象,通过该对象访问实例变量。实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,实例方法由实例对象调用。下面的代码及图5.1说明了实例变量与静态变量关系。classABCD{chardata;staticintst_data;}classDemo{ABCDa,b,c,d}JavaEE基础教程52011年9月23日星期五例5-1关于实例成员和类成员的例子。程序清单:ch05\MemberTest.javapackagech05;classMember{staticintclassVar;intinstanceVar;staticvoidsetClassVar(inti){classVar=i;//instanceVar=i;//类方法不能访问实例变量}staticintgetClassVar(){JavaEE基础教程62011年9月23日星期五returnclassVar;}voidsetInstanceVar(inti){classVar=i;//实例方法不但可以访问类变量,也可以实例变量instanceVar=i;}intgetInstanceVar(){returninstanceVar;}}JavaEE基础教程72011年9月23日星期五publicclassMemberTest{publicstaticvoidmain(String[]args){Memberm1=newMember();Memberm2=newMember();m1.setClassVar(1);m2.setClassVar(2);System.out.println(m1.classVar=+m1.getClassVar()+m2.ClassVar=+m2.getClassVar());m1.setInstanceVar(11);m2.setInstanceVar(22);System.out.println(m1.InstanceVar=+m1.getInstanceVar()+m2.InstanceVar=+m2.getInstanceVar());}}JavaEE基础教程82011年9月23日星期五分析一个不正确的变量引用实例:classStaticError{Stringmystring=“hello”;//实例变量publicstaticvoidmain(String[]args){System.out.println(mystring);//静态方法访问实例变量出错}}错误信息:can’tmakeastaticreferencetononstaticvariable。因为只有对象的方法可以访问对象的变量。JavaEE基础教程92011年9月23日星期五解决的办法:1.将实例变量mystring改为类变量:classStaticError{staticStringmystring=“hello”;publicstaticvoidmain(String[]args){System.out.println(mystring);}}2.将实例变量mystring改为局部变量:classNoStaticError{publicstaticvoidmain(String[]args){Stringmystring=“hello”;System.out.println(mystring);}}返回JavaEE基础教程102011年9月23日星期五例5-2下面例子中的梯形对象共享一个static的下底。程序清单:ch05\CommonLader.javapackagech05;class梯形{float上底,高;//实例变量staticfloat下底;//实例变量梯形(floatx,floaty,floath){//构造方法上底=x;下底=y;高=h;}float获取下底(){return下底;}void修改下底(floatb){下底=b;}}JavaEE基础教程112011年9月23日星期五publicclassCommonLader{publicstaticvoidmain(String[]args){梯形laderOne=new梯形(3.0f,10.0f,20);梯形laderTwo=new梯形(2.0f,3.0f,10);System.out.println(laderOne的下底:+laderOne.获取下底());System.out.println(laderTwo的下底:+laderTwo.获取下底());laderTwo.修改下底(60);System.out.println(laderOne的下底:+laderOne.获取下底());System.out.println(laderTwo的下底:+laderTwo.获取下底());}}JavaEE基础教程122011年9月23日星期五当Java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类的实例成员变量不会被分配内存。但是,类中的类变量,在该类被加载到内存时,就分配了相应的内存空间。如果该类创建对象,那么不同对象的实例变量互不相同,即分配不同的内存空间,而类变量不再重新分配内存,所有的对象共享类变量,即所有的对象的类变量是相同的一处内存空间,类变量的内存空间直到程序退出运行,才释放所占有的内存。JavaEE基础教程132011年9月23日星期五实例方法和类方法的区别:对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址。当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,当创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。无论是类方法或实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的内存。在一个方法被调用执行完毕之前,如果该方法又被调用,那么,方法的局部变量会再次被分配新的内存空间,比如,方法在递归调用时,方法中的局部变量会再次被分配新的内存空间。JavaEE基础教程142011年9月23日星期五this关键字可以出现在类的实例方法中,代表使用该方法的当前对象。为了说明this的用法,下面例子中的“三角形”的构造方法中,有意使用了this。当使用构造方法来创建对象时,构造方法中的this就代表当前对象。5.2this关键字JavaEE基础教程152011年9月23日星期五例5-3“三角形”的构造方法中的this就代表当前对象。程序清单:ch05\Triangle.javapackagech05;class三角形{doublea,b,c;三角形(doublea,doubleb,doublec){//构造方法setABC(this,a,b,c);//调用实例方法}voidsetABC(三角形trangle,doublea,doubleb,doublec){//实例方法,供构造方法调用初始化实例对象。trangle.a=a;trangle.b=b;trangle.c=c;}}classTriangle{publicstaticvoidmain(String[]args){三角形tra=new三角形(3,4,5);System.out.print(三角形型的三边是:+tra.a+,+tra.b+,+tra.c+,);}}JavaEE基础教程162011年9月23日星期五实例方法可以操作类的成员变量,实际上,当成员变量在实例方法中出现时,默认的格式是:this.成员变量。如:classA{intx,y;voidfun(intx){this.x=x;y=x;}}在上述A类中的实例方法fun()中出现了this,this就代表使用fun()的当前对象。所以,“this.x”就表示当前对象的变量x,当对象调用方法fun()时,将函数的局部变量x赋给该对象的变量x。当一个对象调用方法时,方法中的成员变量就是指分配给该对象的成员变量。JavaEE基础教程172011年9月23日星期五通常情况下,可以省略成员变量名字前面的“this.”,如成员变量y。但是,当成员变量的名字和局部变量的名字相同时,成员变量前面的“this.”就不可以省略。同样,类的实例方法可以调用类的其它方法,调用的默认格式是:this.方法,如:classB{voidfun(){this.get();//可省略this.}voidget(){System.out.println(“ok”);}}JavaEE基础教程182011年9月23日星期五在上述B类中的方法fun()中出现了this,this代表使用方法fun()的当前对象。所以,方法fun()的方法体中this.get()就是调用当前对象的方法get()。也就是说,当某个对象调用方法fun()过程中,又调用了方法get()。由于这种逻辑关系非常明确,一个方法调用另一个方法时可以省略方法名字前面的“this.”。但是,this不能出现在类方法中,因为类方法可以通过类名直接调用,这时可能还没有任何对象诞生。JavaEE基础教程192011年9月23日星期五例5-4创建一个有两个方法的类,其中第一个方法使用this,第二个方法不使用this。程序清单:ch05\Rectangle.javapackagech05;classRectangle{//矩形类intwidth;//矩形的宽intusethis(intwidth){//返回宽度的函数this.width=width;//this指自己这个对象returnwidth;}intunusethis(intwidth){intw=width;returnw;}publicstaticvoidmain(String[]args){Rectangler=newRectangle();//类对象的实例化System.out.println(r.width=+r.width+r.usethis(1)=
本文标题:第5章 类的高级特性
链接地址:https://www.777doc.com/doc-4150795 .html