第3章习题解答1.如何定义方法?在面向对象程序设计中方法有什么作用?答:方法的定义包括方法名、方法形参、方法的返回值类型和方法体四部分,方法只能在类中定义。方法是对象的动态特征的描述,对象通过方法操作属性,进而改变对象的状态,完成程序所预期的功能。2.定义一个Dog类,有名字、颜色、年龄等属性,定义构造方法用来初始化类的这些属性,定义方法输出Dog的信息。编写应用程序使用Dog。答:publicclassDog{privateStringname;privateStringcolor;privateStringage;Dog(Stringn,Stringc,Stringa){name=n;color=c;age=a;}publicStringtoString(){returnname+,+color+,+age;}publicstaticvoidmain(Stringargs[]){Dogdog=newDog(小白,白色,2岁);System.out.println(dog.toString());}}3.什么是访问控制修饰符?修饰符有哪些种类?它们各有何作用?答:访问控制修饰符是对类、属性和方法的访问权限的一种限制,不同的修饰符决定了不同的访问权限。访问控制修饰符有3个:private、protected、public,另外还有一种默认访问权限。各个修饰符的作用如下表所示:属性和方法类public默认publicABprotectedB+CB默认BBprivateDDB:包中的类C:所有子类D:本类A:所有类4.阅读程序,写出程序的输出结果classA{privateintprivateVar;A(int_privateVar){privateVar=_privateVar;B:包中的类A:所有类}booleanisEqualTo(AanotherA){if(this.privateVar==anotherA.privateVar)returntrue;elsereturnfalse;}}publicclassB{publicstaticvoidmain(Stringargs[]){Aa=newA(1);Ab=newA(2);System.out.println(a.isEqualTo(b));}}程序的输出结果为:false5.阅读程序,写出程序的输出结果publicclassTest{publicstaticvoidmain(String[]args){intx;inta[]={0,0,0,0,0,0};calculate(a,a[5]);System.out.println(thevalueofa[0]is+a[0]);System.out.println(thevalueisa[5]is+a[5]);}staticintcalculate(intx[],inty){for(inti=1;ix.length;i++)if(yx.length)x[i]=x[i-1]+1;returnx[0];}}程序的输出结果为:thevalueofa[0]is0thevalueisa[5]is56.阅读程序,写出程序的输出结果publicclassTest{publicstaticvoidmain(String[]args){Stringstr1=newString(Java);Stringstr2=newString(Java);System.out.println(str1==str2);}}程序的输出结果为:false7.阅读下列程序,程序中已经指明错误位置,请说出错误原因。1.packagesample;classA{privateintnum;A(){num=0;}intget(){returnnum;}}classZ{publicstaticvoidmain(String[]args){Aa1=newA();intt=a1.get();ints=a1.num;//此处有错误}}错误原因:私有变量只能在其所在类中直接使用,在其它类中不可以直接使用。8.阅读下列程序,程序中已经指明错误位置,请说出错误原因。其中,方法m的功能是把形参的值赋给类的成员变量x。classAlpha{privateintx;publicvoidm(intx){x=x;//此处有错误}}应该修改为:this.x=x;9.下面定义了一个完整的类,包括有构造方法。阅读这段程序,程序中已经指明错误位置,请说出错误原因。classAlpha{privateintx;voidAlpha(){//此处有错误x=0;}publicvoidgetX(){returnx;}}错误原因:构造方法不能有返回类型,也不能以void作为它的返回类型。10.定义一个名字为MyRectangle的矩形类,类中有4个私有的整型成员变量,分别是矩形的左上角坐标(xUp,yUp)和右下角坐标(xDown,yDown);类中定义了无参数的构造方法和有4个int参数的构造方法,用来初始化类对象。类中还有以下方法:getW()-计算矩形的宽度;getH()-计算矩形的高度;area()-计算矩形的面积;toString()-把矩形的宽、高和面积等信息作为一个字符串返回。编写应用程序使用MyRectangle类。答:publicclassMyRectangle{privateintxUp,yUp,xDown,yDown;MyRectangle(){xUp=0;yUp=0;xDown=0;yDown=0;}MyRectangle(x1,y1,x2,y2){xUp=x1;yUp=y1;xDown=x2;yDown=y2;}publicintgetW(){returnxDown-xUp;}publicintgetH(){returnyDown-yUp;}publicintarea(){returngetW()*getH();}publicStringtoString(){return矩形宽:+getW()+矩形高:+getH()+矩形面积:+area();}publicstaticvoidmain(Stringargs[]){MyRectanglerectangle=newMyRectangle(1,2,7,8);System.out.println(rectangle.toString());}}11.定义一个表示学生的类Student,包括的成员变量有:学号、姓名、性别、年龄;成员方法有:获得学号、姓名、性别、年龄;修改年龄。并书写Java程序创建Student类的对象及测试其方法的功能。答:publicclassStudent{privateStringnumber,name;privatebooleansex;//true表示“男”,false表示“女”privateintage;Student(){number=;;sex=true;age=0}Student(Stringnum,Stringna,booleans,inta){number=num;sex=s;age=a;}publicStringgetNumber(){returnnumber;}publicStringgetName(){returnname;}publicbooleangetSex(){returnsex;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}publicStringtoString(){return学号:+number+姓名:+name+性别:+sex+年龄:+age;}publicstaticvoidmain(Stringargs[]){Studentstu=newStudent(200601012,张三,true,20);System.out.println(stu.toString());}}12.如何定义静态成员变量?静态成员变量有什么特点?静态方法有何特点?为什么有的时候需要定义静态方法?静态方法处理的成员变量有什么要求?答:在定义成员变量的时候前面加上static修饰符,该变量即成为静态成员变量,静态成员变量也称为类变量。类变量和实例变量的区别是,不管为类创建了多少对象,系统仅在第一次调用类的时候为类变量分配内存,所有对象共享该类的类变量。因此,可以通过类本身或者某个对象来访问类变量。当定义一个方法的时候,使用static关键字说明该方法是类方法(静态方法)而不是实例方法。当第一次调用含类方法的类时,系统只为该类的类方法创建一个版本。这个版本被该类和该类的所有实例所共享。调用类方法时不需要实例化类,因此对那些不想实例化的类,或者不需要实例化的类,但又需要调用该类的方法,这时就可以把该方法定义为类方法。类方法只能操作类变量,不能访问在类中定义的实例变量,同时,类方法可以在类中被调用,不必通过创建一个实例对象来调用一个类方法,当然也可以在实例对象中调用类方法。13.使用静态成员变量来计算内存中的实例化的对象数目。publicclassCount{privateStringname;privatestaticintnumber=0;//计数Count对象生成的个数Count(){name=null;number++;}Count(Stringn){name=n;number++;}protectedvoidfinalize(){//当有一个Count对象释放时会执行该方法,此时对number减1System.out.println(有一个Item对象释放了);number--;}publicstaticvoidmain(Stringargs[]){Countc1=newCount();Countc2=newCount();c1=null;System.out.println(执行垃圾收集前Item对象的个数:+number);//强制执行垃圾收集,观察Count类中number值的变化java.lang.System.gc();System.out.println(执行垃圾收集后Item对象的个数:+number);c1=newCount();java.lang.System.gc();System.out.println(执行垃圾收集后Item对象的个数:+number);}}14.定义一个计算矩形面积、立方体和球体体积的类。该类完成计算的方法用静态方法实现。publicclassCalculate{publicstaticdoublecalculateRectangleArea(doubleheight,doublewidth){returnheight*width;}publicstaticdoublecalculateCubeVol(doublex,doubley,doublez){returnx*y*z;}publicstaticdoublecalculateSphereVol(doubler){return(4/3)*3.14*r*r*r;}}15.设计一个表示用户的User类,类中的变量有用户名、口令(私有的)和记录用户个数的变量(静态的),定义类的3个构造方法(没有参数、有一个参数给用户名赋值、有两个参数给用户名和口令赋值)、获取和设置口令的方法、返回字符串表示的类信息的方法(包含用户名、口令)。编写应用程序测试User类。答:classUser{privateStringname,password;privatestaticintnumber;User(){name=null;password=null;number++;}User(Stringn){name=n;password=null;number++;}User(Stringn,Stringps){name=n;password=ps;nmuber++}publicStringgetPassword(){//密码全部以明文操作,没有