chapter07深入理解类和对象引用_第1页
chapter07深入理解类和对象引用_第2页
chapter07深入理解类和对象引用_第3页
chapter07深入理解类和对象引用_第4页
chapter07深入理解类和对象引用_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

第7 的方面:方法的返回值、this关键字、类成员和实例成员、控制以及变量作用域。方法的返回返回在这种情况下,一个return语句通常被用于终止一个控制流程块并退出方法。如下代码所示。 如果一个方法已经为void,但是在方法内还试图返回一个值的话,编译器将报错。如果一个方法没有为void,那么就必须包含一个return语句,后跟相应的返回值。例如:return返回值 publicintgetHeight(…return}publicintgetHeight(…return}publicintgetArea({returnwidth*publicintgetArea({returnwidth*publicpublicclassCircleprivatedoublearea=publicPointgetPoint(intx,int{returnnew} 返回类型为publicvoidsetRadius(doublenewRadius){radius=newRadius;} publicdoublereturn3.14*radius*}}在上面的代码中,返回一个新创建的PointgetPoint(intx,inty)方法时传递的实参值初始化实例对象。返回类型Point指明此方法一定要返回一个Point对象。返回类或classprivateintx;classprivateintx;x坐privateinty;y坐publicPoint(intcoordinateX,intcoordinateY){x=coordinateX;y=coordinateY;}publictoString(){return"x:"++",y:"+}}publicclassPointExamplepublicPointgetPoint(intx,inty){returnnewPoint(x,y);}publicpublicstaticvoidmain(String[]PointExamplepointExample=newPointpoint=pointExample.getPoint(3,5);//将返回值赋给同类型的变量}}ImaginaryNumberjava.lang.NumberNumber类又是Object的子类,如下图所示。图ImaginaryNumber类的层次结publicNumberreturnANumber()} publicNumberreturnANumber()}法可以返回的返回类型Number的子类,但是不能返回其超类。}JDK1.5中加入的新特性,即在面向对象的编程中子类在重写父类的方法时可以改变这个方法的返回值使用thispublicclassPointprivatepublicclassPointprivateintx= 最经常使用this的字段。例如,象下面的代码一样定义Point被privateprivateinty= publicPoint(inta,int{x=a;y=b;}{x=}publicvoidsetY(int{y=}}publicclasspublicclass{publicintx= 段 段{this.x=x;this.y=y;}{this.x=}{this.y=}}xy都了对象的字段xy。在构造器中,x是构造器的第一个参数的一个本地副本。要Point的字段x,构造器必须使用this.x。按惯例,在使用构造器对成对构造器使用式构造器调用”。下面是另外一种实现形式的Rectangle类。publicclassRectangle privateprivateintx,privateintwidth, {this(0,0,{this(0,0,width,}publicRectangle(intxintyintwidthintheight this.x this.y this.width this.height }}的{this(0,0,0,}{this(0,0,width,}用this关键字调用另一个构造器时,调用代码必须是当前构造器的第一行代码。 一个类可能会使用public修饰符,在这种情况下,类对在任何地方的其它类都是可见的。如果还有两个额外的修饰符private和protectedprivate修饰符说明成员只能在它所在的类的内部被。protected修饰符说明成员只能在它所在的包中被到(包级私有),另外,也可以被位于其它包中的在成员级别,优先级是这样的:public>protected>package-private>private。如表7.1列出了表7.1级类包是是是是是是是否是是否否是否否否么如何选择使用级别呢?如果B程序员要使用A程序员的类,A程序员必须保证自己写的publicpublic{privateStringid;privateStringname;privateintage;(Stringid,Stringname,gender){this.id=id;=name;this.gender=gender;}{return}{return}{return}{this.age=}{return}}上面定义了一个类,代表个人信息。假定在创建一个人的信息时就设定其号(id)、(name)和(gender),一旦设定,今后个人信息中的号、和就不允许更改,但是可以改变的。为了控制其它类对成员变量的权限,在设计类时,将所有字段设为private私有的,然后提供了一个带有三个参数(号、和)的构造器用于在创建id、name和genderid、namegender,因为不允许修改,所以在类中只提供了publicgetXXX()方法。而字段gender允许和修改,所以既提供publicsetXXX()方法,也提理解实例成员和类成实例变classclassprivateStringbookName;privateintpageSize;privatefloatbookPrice;Book()}Book(StringbookName,intpageSize,float{this.bookName=bookName;this.pageSize=pageSize;this.bookPrice=bookPrice;}}publicclassBookjavaBook=newBook(" JavaSE7",620,68.00f);BookjavaeeBook=newBook(" }}Book类型的实例对象,各个实例对象的实例变量在内存中的状态如类变在中含有static修饰符的字段称为“静态变量”或“类变量”。它们与类相关联,而不是与对classclassApublicstaticint }}publicclass{publicstaticvoidAa1=newA(); System.out.println("创建A的第二个对象前,a="+A.a);Aa2=new}}AA的构造器,在构造器中对类变量a自增1。因为所有的对象共享同一个类变量,所以它们对类变量a的改变也累加。publicclassprivateintpageSize;privatefloatbookPrice;privateintid;publicclassprivateintpageSize;privatefloatbookPrice;privateintid;的privatestaticintnumberOfBooks=} newBook( classBookprivateintpageSize;privatefloatbookPrice;privateintid;的privatestaticintnumberOfBooks=Book()bookNameJava从初学到精通";pageSize=652;bookPrice=classBookprivateintpageSize;privatefloatbookPrice;privateintid;的privatestaticintnumberOfBooks=Book()bookNameJava从初学到精通";pageSize=652;bookPrice=}Book(StringbookName,intpageSize,floatbookPrice)this.bookName=bookName; this.pageSize=pageSize; //用参数pageSize的值初始化字段pageSizethis.bookPrice=bookPrice; //用参数bookPrice的值初始化字段bookPriceid=++numberOfBooks;}intgetID()return}}publicclassBookjavaBook=newBook(" JavaSE7",620,68.00f);BookjavaeeBook=newBook(" }}类方static修饰符,这样的方法称为“静态方法”或“类方法”。类方法被调用时应使用类名,而 publicstaticgetNumberOfBooks(){return静态方法的一个普遍的作用,是用来静态字段。例如,在上面的Book类中,再添加一个静态publicstaticgetNumberOfBooks(){return使用this关键字,因为没有this的实例可供使用。常staticfinaldoublePI= 通过规定π的值应该是3.975),就需要重新编译任何使用了这个常量的类以获得当前新的值。实例:Book publicclassBook{privateintpageSize;privatefloatbookPrice;的privateint的privatestaticintnumberOfBooks=publicBook()bookNameJava从初学到精通";pageSize=652;bookPrice=}publicBook(StringbookName,intpageSize,floatbookPrice)this.bookName=bookName; this.pageSize=pageSize; //用参数pageSize的值初始化字段pageSizethis.bookPrice=bookPrice; //用参数bookPrice的值初始化字段bookPriceid=++numberOfBooks;}{return}publicstaticintgetNumberOfBooks(){returnnumberOfBooks;}publicvoidbookInfo()System.out.println("书名:bookName页数:pageSize定价:}{return}{this.bookName=}System.out.println("书名:bookName页数:pageSize定价:}{return}{this.bookName=}{return}{this.pageSize=}{return}{this.bookPrice=}}初始化字其它逻辑。而要初始化类变量,Java语言提供了“静态初始化块”。静态初始}{staticintnumbersOfBooks;numbersOfBooks=}publicstaticvoidmain(String[]}}3classclassWhateverpublicstaticvarTypemyVar=initializeClassVariable();privatestaticvarTypeinitializeClassVariable(){}}其中,varType指的是返回类型。在这里,一个私有静态方法initializeClassVariable()来对类变初始化实例成publicBedAndBreakfast{publicstaticintcapacity=10;privatebooleanfull=publicBedAndBreakfast{publicstaticintcapacity=10;privatebooleanfull=publicclassBookprivateintpageSize;privatefloatbookPrice;privateintid;privatestaticintnumberOfBooks=publicBook()bookName=" JavaSE7";pageSize=652;bookPricepublicclassBookprivateintpageSize;privatefloatbookPrice;privateintid;privatestaticintnumberOfBooks=publicBook()bookName=" JavaSE7";pageSize=652;bookPrice=}publicBook(StringbookName,intpageSize,floatbookPrice)this.bookName=bookName; this.pageSize=pageSize; //用参数pageSize的值初始化字段pageSizethis.bookPrice=bookPrice; //用参数bookPrice的值初始化字段bookPriceid=++numberOfBooks;}}{{}publicclasspublicclassInitializeBlockExample{}}public){}publicpublicstaticvoidmain(String[]InitializeBlockExampleinitializeBlockExample1=newInitializeBlockExample();InitializeBlockExampleinitializeBlockExample2=newInitializeBlockExample(3);}}classWhateverprivatevarTypemyVar=initializeInstanceVariable();protectedfinalvarTypeinitializeInstanceVariable()}}另classWhateverprivatevarTypemyVar=initializeInstanceVariable();protectedfinalvarTypeinitializeInstanceVariable()}}varTypefinal()方法(最终方法),final()方法将会引起错误,所以在实例初始化期间对实例变量的初始化,必须调用final()方法。初始化执行顺 publicpublicclassInitializeOrderExampleintnumber=staticdoublePI=; System.out.println("number:"+number);number=22;}{ System.out.println("number:"+number);number=21;System.out.println("number:"+number);} PI=3. }publicstaticvoidmain(String[] }}变量的作用publicclassVariableScopeExamplepublicprintMsg(){}publicstaticvoidmain(String[]new}privateStringmessage= }publicclassVariableScopeExamplepublicprintMsg(){}publicstaticvoidmain(String[]new}privateStringmessage= }内,所以在开始定义的方法printMsg()中也可以使用。publicclassVariableScopeExample2publicvoid 量Stringmessage=publicclassVariableScopeExample2publicvoid 量Stringmessage= }publicstaticvoidmain(String[]new}}VariableScopeExample.java:5VariableScopeExample.java:5:错误:^ 变量位置:1:publicclassVariableScopeExample2publicvoidStringmessage= }publicstaticvoid:publicclassVariableScopeExample2publicvoidStringmessage= }publicstaticvoidmain(String[]new}}}publicprintMsg(){}message){}publicstaticvoidmain(String[]new }}无法使用该方法的参数变量message的。{privateStringmessage=" publicvoidprintMsg(){Stringmessage }publicprintMessage(){ }public{privateStringmessage=" publicvoidprintMsg(){Stringmessage }publicprintMessage(){ }publicstaticvoidmain(String[]VariableScopeExample4variableScopeExample4=newVariableScopeExample4();}opublicclassprivateStringmessage这是字段}publicvoidStringmessage这是局部变量";}publicstaticvoidmain(String[]VariableScopeExample5variableScopeExample5publicclassprivateStringmessage这是字段}publicvoidStringmessage这是局部变量";}publicstaticvoidmain(String[]VariableScopeExample5variableScopeExample5newVariableScopeExample5(); }在publicclassVariableScopeExample6message){}message){}publicstaticvoidmain(String[]VariableScopeExample6variableScopeExample6=newVariableScopeExample6(); }}在上面这个程序中,两个不同的方法,其参数变量名称相同,但各自的作用域不,所以可以正}}嵌套“嵌套类”,而包含ClassB的类ClassA称为“外部类”。classclassOuterClassclassNestedClass}}classOuterClassstatic estedClass}classInnerClass}}classOuterClassstatic estedClass}classInnerClass}}作为“外部类”的一个成员,一个嵌套的类可以被为private、public、protected或者包级私有的(默认的)。(而外部类只能被为public或包级私有)这是将只用在同一个地方的类进行逻辑上的分组的法。如果一个类只对另一个类有用,增强了封装性。例如两个顶级类A和B,B需要A中被为private的成员。通过将类B隐藏在类A中,A的成员可以被为私有的,同时B也可以它们。另外,B本身对外部嵌套类能使代码可读性和可性更强。在顶级类中嵌套较小的类使得代码最接近它被使用的静态嵌 estedClassnestedObject=new estedClass()内部classclassOuterClassclassInnerClass}} 内部类的实外部类的实 内部类publicpublicclassDataStructureprivatefinalstaticintSIZE=15;p

温馨提示

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

最新文档

评论

0/150

提交评论