Java程序设计实用教程第4版习题解答与实验指导第18章.docx
JaVa程序设计好用教程(第4版)习题解答及试验指导叶核亚编著2019年11月书目“Java程序设计”课程教学要求1第1章JaVa概述4第2章JaVa语言基础6第3章类的封装、继承和多态27第4章接口、内部类和JaVaAPl基础45第5章异样处理51第6章图形用户界面53第7章:多线程59第8章输入/输出流和文件操作62“Java程序设计”课程教学要求1 .课程性质、目的和任务程序设计是高等学校计算机学科及电了信息学科各专业本科的核心专业基础课程,是培育学生软件设计实力的重要课程。在计算机学科的本科教学中,起着特别重要的作用。“Java程序设计”是计算机科学及技术专业本科的专业基础限选课,开设本课程的目的是:进行程序设计和面对对象方法的基础训练;运用Java编程技术,设计解决操作系统、网络通信、数据库等多种实际问题的应用程序。本课程通过全面、系统地介绍JaVa语言的基础学问、运行机制、多种编程方法和技术,使学生理解和驾驭面对对象的程序设计方法,理解和驾驭网络程序的特点和设计方法,建立起坚固扎实的理论基础,培育综合应用程序的设计实力。本课程的先修课程包括:C/C+程序设计、C/C+程序设计II、数据结构、操作系统、计算机网络、数据库原理等。2 .教学基本要求本课程的基本要求如下。了解JaVa语言特点,理解JaVaAPPIiCatiOn应用程序的运行原理和方法。驾驭在JDK环境中编译和运行程序的操作,熟识在MyECliPSe集成开发环境中,编辑、编译、运行和调试程序的操作。驾驭Java语言中语句、数组、引用类型等基本语法成分的运用方法,通过类、接口、内嵌类型、包、异样处理等机制表达和实现而对对象程序设计思想。驾驭Java的多种好用技术,包括图形用户界面、多线程、文件操作和流、运用UR1.和Socket进行网络通信等。熟识JaVaJDBC数据库应用的设计方法。熟识基于JSP的Web应用设计方法。重点:面对对象概念,图形用户界面,线程,流及文件操作,Socket通信。难点:继承和多态,线程同步,流及文件操作,S。Cket通信,JDBa第1章Java概述本章教学内容及要求如下:了解JaVa语言特点,理解JaVaAPPliCatiOn应用程序的运行原理和方法,理解由JaVa虚拟机支持的程序运行机制。驾驭在JDK环境中编译和运行程序的操作,熟识在MyECIiPSe集成开发环境中编辑、编译、运行和调试程序的操作。重点:驾驭在JDK和MyEclipse环境中编译和运行JavaApplication应用程序的操作。1.1 了解JavaI-IJaVa具有哪些适合在Internet环境中运行的特点?【答】跨平台特性、完全面对对象和简洁性、牢靠性、平安性、多线程、支持分布式网络应用等。1-2什么是跨平台特性?Java怎样实现跨平台特性?【答】跨平台特性是指一个应用程序能够运行于不同的操作系统平台。JaVa采纳虚拟机技术支持跨平台特性,不同的操作系统上运行不同版本的JaVa虚拟机。-3JaVa源程序文件编译后生成什么文件?程序的运行机制是怎样的?【答】JaVa将源程序文件(*.java)中的每个类编译生成一个字节码文件(.class),由JaVa虚拟机说明执行字节码文件。1-4Java应用程序有哪两种形式?它们的运行方式有什么不同?【答】JaVa应用程序有两种:ApplicationAppleteApplication是能够独立运行的应用程序,有限制台和图形用户界面两种运行方式。APPlet是可以嵌入Web页面的最小应用,它不能独立运行,必需嵌入超文本(*.html)中,由阅读器中的JaVa说明器说明执行。1.2 JDK1-5环境变量path和classpath的作用分别是什么?【答】path供应可执行文件(.exe)的路径:classpath供应类文件(.class)的路径。1-6什么是包?为什么须要包机制?【答】包(PaCkage)是类的集合。包是Java区分类名字空间的机制。一个包中的多个类之间不能重名,不同包中的类名则可以相同。【习1】为例1.2的1.ine类增加以下方法:publicdoublelength()/返回直线长度inta=start.-end.x,b=start.y-end.y;returnMath,sqrt(a*a+b*b);/Math.Sqrt(X)返回x的平方根-7Java对源程序文件中的声明语句及文件其命名规则有什么要求?【答】在一个JaVa源程序文件(*.java)中,可以运用package语句声明包,运用import语句导入包,之后运用CIaSS或interface声明多个类或接口。其中,声明为public权限的类或接口只能有一个,且文件名必需及该类名相同。1-8程序中的错误有哪几种?分别在什么时刻被发觉?【答】语法错、语义错、逻辑错。编译时能够发觉语法错,运行时能够发觉语义错,运行时不能发觉逻辑错。第2章Java语言基础本章教学内容及要求如下:驾驭Java语言的基本语法成分,包括标识符及关键字、数据类型、运算符、表达式、变量声明等语言成分,驾驭分支、循环等流程限制语句的语法和运用。特殊留意及C/C+的不同之处。驾驭数组类型的声明和动态内存申请,驾驭以基本数据类型和类的两种方式声明和运用字符串。驾驭Java语言的方法声明和调用规则,驾驭基本类型和引用类型作为方法参数和返回值的传递规则。驾驭MyECIiPSe程序调试技术。重点:数组的引用模型:运用静态方法,引用类型作为方法的参数和返回值。难点:位运算,二进制:递归算法。VyECIiPSe程序调试技术。2.1语言成分i数据类型、变量及运算21Java语言的基本数据类型有哪些?引用数据类型有哪些?【答】基本数据类型有:整数类型byte、short,int.long,浮点数类型float、double,字符类型char,布尔类型boolean;引用数据类型包括数组(array).类(class)和接口(interface).2-2及C+语言相比,Java语言的变量和常量声明有什么差别?【答】JaVa语言没有全局变量,(成员)局部变量含义及变量声明格式及C+相同。Java语言没有宏替换,运用最终变量概念代替C+中的常量和宏替换。运用final关键字声明最终变量,只能赋值一次,这样既增加了常量功能,乂避开全局变量和宏替换的副作用。23Java语言的运算分哪些类型?及C+语言相比,运算符及运算含义有哪些变更?【答】Java语言有克术运算、关系运算、位运算、逻辑运算、赋值运算、强制类型转换、条件运算、括号运算、点运算、new、+字符串连接运算和instanceof运算等,其中+字符串连接和instanceof运算符是JaVa新增的,此外,放弃了C+的SiZeof运算符。及C+语言相比,Java语言的语法更为严谨,将C+中某些简洁引起混淆的语法做了修订,编译时也将严格进行检查。在Java语言中,运算符及运算含义有变更的说明如下。没有赋值功能的表达式不能作为语句。例如:inti=0;i+1:/编译错“无效的赋值运算”逗号是分隔符,仅用于分隔表达式,不是运算符,不能出现在表达式中。例如:for(inti=0,j=0;i<n&&j<n;i÷+,j+)/正确,逗号是分隔符intx=0,y=0;正确,逗号是分隔符System,out.println(w*+(x=l,y=2);/编译错,表达式不能包含逗号=l,y=2;编译错,逗号仅用于分隔表达式,不是运弊符x=ly=2;/正确Java语言增加boolean类型用于逻辑运算,其值不是0或1。例如:booleanb=0;编译错“不能将int荚型转换成boolean类型”关系运算、逻辑运算和instanceof运算的结果都是boolean类型。整数不能进行逻辑运算。Java语言严格区分boolean及int类型,运算类型不能混治。boolean类型及整数类型或其他类型不能进行算术运算、关系运算、逻辑运算。例如:booleanb=false+0;编译错"boolean类型及int类型不能进行+运算”if、WhiIe等语句中的条件表达式不能是赋值运算,否则产生编译错。if(i=0)编译错,i=0运结巢是int类型,而不是booleanwhile(i=0)编译错字符串连接运算符(+)自动将其他类型变量值转换成字符串类型。2.整数运算的数据类型及数据溢出2-4表达式(byte)127+(byte)127的运算结果是,其数据类型是0【答】254,intK说明1Java的整数默认是int类型,byte类型只是形式上的,取相应int值的最低1个字节。全部byte和short整数运算仍旧是int类型运算,运算结果是int类型,当运算结果在byte数据范围内时,也可视作byte类型。2-5已知Integer.M/X_V/1.UE值为2147483647,表达式Integer.MAX,V1.UE+1的运复结果是。【答】-2147483648,即0x80000000&说明Integer.MAXJfA1.UE值为0x7fffffff,0x7fffffff+l=0x80000000,数据溢出。运算过程如图2.1所示。图2int整数数据溢出2-6设intmin=Integer.MIN-V1.UE;,表达式设n+min的运算结果是o【答】0K说明Integer.MINJfA1.UE值为0x80000000,0x80000000+0x800000000,数据溢出。2-7设intmin=Integer.MIN-V1.UE;»表达式(IOng)(Inin+min)的运算结果是。【答】0K说明Integer.MINJrA1.UE值为0x80000000,0x80000000+0x80000000=0,数据溢出。强制类型转换,只是把0强制转换成long类型。2-8设intmin=Integer.MIN_V/1.UE;,表达式(long)min+(long)min的运算结果是。【答】Oxffffffff00000000,或-4294967296。K说明讥nteger.MINVA1.UE值为0x80000000,先强制转换成long类型,值为OXffffffff80000000,再作为IOng类型运算,数据不溢出。2-9设intmin=Integer.MIN-V1.UE;longg=min+min:,则g的值姑【答】0说明IIInin+min作为int类型运算,数据溢出。2-10设intmin=Integer.MINVA1.UE;longg=nin;g+=min;,则g的值是。【答】Oxffffffff00000000,或-4294967296。R说明longg=min;赋值将min自动扩容到IOng类型,再运算,long数据不溢出。3.整数位运算2-11表达式125&10的值是,表达式125|10的值是O【答】8,127K说明11int整数二进制位运算,运算过程如图2.2所示。VQ22int整数二进制位运算4 .浮点数运算2-12设doublex,将X按四舍五入方式强制转换成int类型的表达式的是三【答】(int)(x+0.5)5 .字符类型及运算2-13Java语言的char字符类型及C/C+语言相比有什么差别?【答】两者字符常量表示形式相同,都是用单引号将字符括起来作为字符常量。不同之处如下:C/C+语言的Char类型表示ASCll字符,包括数字、字母、符号等,字长为1字节,取值范闱为。127:一个汉字用2字节表示。Java语言的char类型表示Unicode字符,包括ASCII字符和汉字等,一个ASCil字符和汉字均占用2字节,取值范围为u0000uFFFF(即。65535)。274表达式,a'+l的运算结果是,(Char)('a'+l)的运算结果是»【答】98,'b'说明IIChar也是数值类型,可将char看成是2字节无符号整数,范围是06553501是int类型,4字节°'a'+l进行的是算术运算,操作数的数据类型相容,结果取较长的int数据类型,'a'+l运算含义为将'a'的ASCn码97加I0(char)Ca'+1)将98强制转换成char类型,结果为'b,02-15设CharChI=I08,ch2=73;,以下语句有什么错误?如何改正?chl=chl+ch2;【答】编译错,不能将int转换成Char.改正如下:chl=(char)(chl+ch2);K说明及byte和short类型存储和运算原理相同,char也是以int存储和运算的,在065535范围内的整数可看成个UniCOde字符的编码,因此能够以字符显示。两个Char作为数值参与算术运算时,仍旧是int类型运算,运算结果是int类型。所以,不能赋值给char变量。2.2 流程限制语句216Java语言的语句及C/C+语言有什么差别?【答】JaVa语言语句的语法同C/C+语言,Java语言不支持goto语句。【习2.1理解JaVa的字符类型。以下程序段输出ASCIl码可打印字符表。System.out.printin(*ASC11码可打印字符(u0021WuOO7e)表”);for(charch='u002;ch<,u007e,;ch+)/输出ASCIl码可打印字符学“System,out.print(ch+*");if(ch%32=0)System,out.println():程序运行结果如下:ASCll码可打印字符(u0021u007e)表!”*$%&'()*+,-./0123456789::<=>?©BCDEFGHIJK1.MNOPQRSTUVWXYZA、abcdefghijklmnopqrstuvwxyz修改上述程序段的for语句表达式如下,输出Unicode汉字字符表。for(charch=>u4e00,;ch<=>u9fa5,;ch÷+)/Unicode汉字字符表'一''Unicode字符的取值范围是065535(u0000-uffff),反之,并不是065535之中每个值都对应一个字符,标准输出语句输出没有对应字符的编码时,输出结果是问号“?例如,128没有对应字符,以下欲输出编码为128的字符,输出结果是问号。System.out.printIn(char)128);/输出“?”2-17指出下列程序段中的错误以及出错缘由。ints=0;for(inti=0:i<10;i+)s+=i:i+:【答】最终一句产生编译错。变量i的作用域在for语句中,在for语句之外则不能运用。2.3 数组1.一维数组2-18及C/C+的数组相比,JaVa的数组做了哪些改进?具有怎样的优越性?【答】Java数组都是动态数组,在声明数组变量之后,运用new运算符申请数组存储空间。供应length属性表示数组长度。JaVa的数组是引用数据类型,两个数组变量之间的赋值是引用赋值,传递地址等引用特性,没有申请新的存储空间。Java将严格检查数组元素下标范围,程序运行时,假如ai的下标i取值超出0a.IenglhT范围,则作为错误处理,产生“数组下标越界”异样,程序运行终止。串)等。字符串只能在同一行内,不能换行。Java的String字符串是一个类,属于引用数据类型。java.lang.String类供应构造串对象、求串长Iength()、取字符charAt(i),求子串substring。、推断相等equalsO.比较大小ComPareTO()等操作。COnIPareTo()方法说明详见教材第4章Comparable接口,更多方法说明详见教材附录E0String类表示常量字符串,不供应插入、删除子串操作。String及一般类不同的是,具有某些基本数据类型的特性。Java为String类重载了赋值和连接运算。例如:Stringstr="abc"字符串变量能够赋值为字符串常量str="abc"+"xyz”;/"+”将两个字符串首尾相接连起来,结果为"abcxyz"str+="xyz"+=定义为字符串变量在原串基础上连接另一个字符串"i="+10/Java自动将其他类型值转换为字符串,结果为"i=10”JaVa的字符串对象不是字符数组,所以,不能以数组卜标格式Str仃对指定位置的字符进行操作。伊妆11,以卜语句有语法错:strl=a,;语法错误,没有Str表示方式C/C+语言采纳字符数组表示字符串,以StHZI形式对字符串str的第j个字符进行存取操作,并在库文件string,h中供应诸如strlen()strcpy()>strcnp()StrCat()等函数实现字符串操作。这种表示方式是不健壮、担心全的,它没有对数组所运用的存储空间进行限制,也没有对数组卜.标进行越界检查,会产生更改字符串结束符"'0"等错误,strcpy(char*strl,Char*str2)函数甚至可以将一个长字符串复制到一个短字符串的字符数组中,字符数组运用超出其预定范围的存储空间,非法占用本不属于它的存储空间,导致随意更改其他变量值等严峻错误,strcat(char*strl,char*str2)函数存在同样问题。2-25怎样将数值类型的数据转换成字符串?【答】将数值及空串进行字符串连接运算,例如:inti=123;Strings=i+”;字符串连接运算,运算结果类型为SIring2-26设CharCh=97;,表达式""(char)"+(ch+O)+"='"+ch+"'""的运算结果是«【答】"(char)97='a'"R说明HcharCh=97,即CharCh='a'ch÷O进行的是算术运算,操作数的数据类型相容,结果取较长的数据类型,因此,当Chareh=97时,chM)结果为int类型的97。其后表达式各项进行字符串连接运算,得到结果。Java不支持程序员对运第符重载功能。但Java自己将“+”运算符重载为字符串连接运算,并且自动将其他类型转换成String。重载是多态的一种形式,以下两个表达式都是“+”运算,依据操作数类型的不同,能够区分所进行的不同运算:ch+O整数加法运算,运算结果类型为intCh+”"字符串连接运算,运算结果类型为String2-27能否以si格式读写JaYaString字符串中的字符?为什么?【答】JaVa的字符串不是字符数组。JaVa没有供应si格式表示字符串中指定字符。缘由分析:假如JaVa重载运算符供应si格式,则si格式表示可读写,即可通过以下两种方式对字符串中指定字符进行读取和弊值用作,例如:Strings="abc"charch=s0;读取串中指定元素值s0='x'写,对串中指定元素赋值而String类是常量字符串,只能读不能写字符。因此,String类供应ChaCAt(i)方法读取第i个字符,功能同读取si,而没有供应写字符方法,java.lang.StringBuffer类有Se字ha方法i,ch)方法设置第i个字符为ch.通过声明方法对对象属性进行读写操作,符合类的封装概念,详见教材第3章封装概念。2-28怎样比较两个字符?怎样比较两个字符串?有几种比较字符串的方法?【答】char字符是基本数据类型,可以运用=和!=运算符比较是否相等,也可运用、=、=运算符比较大小。String字符串是类,供应equals(obj)方法推断是否相等,返回boolean类型。供应ComPareTO(CObj)比较大小,返回int类型,当返回0时,衣示两者相等:当返回正数时,衣示当前对象大;当返回负数时,发示当前对象小,说明详见教材第4章COmParable接口。2-29怎样将数值按指定格式转换成字符串?【答】String声明如下静态方法format。返回指定格式的字符串:publicstaticStringformat(Stringformat.Object.args)返向format瘠比格式字将由其中,格式字符串format定义为:机参数索引$宽度1.精度变换类型变换类型取值有:b(boolean),c(字符)、C(字母大写)、d(十进制整数)、。(八进制整数)、X(十六进制整数)、e(浮点数指数形式)、f(浮点数小数形式)、s(字符串字母小写)、S(字符串字母大写)。参数索引指定第几个参数,省略时为默认次序。当指定宽度不足时,以实际宽度显示:可用变量指定宽度。例如:结果为结果为结果为String.formatC,%4d*,1)“1”。宽度为4位,不足时,前补空格String,formatC,%04c,1)“0001”。宽度不足4位时,前补0String.format(z,+4dw,Integer.MIN_VA1.UE)m-2147483648+表示总显示正负号当指定宽度不足时,以实际宽度显示String.format("%,d”,Integer.MAX_VA1.UE)结果为“2,147,483,647”。以,逗号作千位分隔String,format(*Sum=l+.+%2$d=%l$d*,55,10)结果为/八进制整数十六进制整数/十进制整数十进制整数十进制整数TwSum=I+.+10=55,String,format(z,%w,0177)0177的十六进制形式为“7f”String.formatCr%o*,0x80000000)0x80000000的八进制形式“20000000000”String.formatCz%8x,127)127的十六进制形式为“7f”String,format(,%08xi255)255的十六进制形式为"OOOOOOff”String,formatC,%08w,-1)的十六进制形式为“ffffffff”String,format(*%+08x,-1)运行错,抛出异样,十六进制不支持正负号String,format(飞9.2f*,1234.56789)结果为“1234.57”。以9位宽度2位小数表示浮点数String,format(*,1234.56789)结果为“1.234568c+03”,浮点数科学记数法格式i11tn=10;String.format("%"+n+"c",'')返回长度为n的空格字符串。用变量指定宽度2 .标准输入2-30程序运行时有哪几种方式能够输入数据?怎样获得输入数据?输入数据是什么类型?怎样获得输入数值数据?【答】输入数据方式有多种:吩咐行参数、标准输入和图形用户界面等。吩咐行参数JDK和MyEclipse均供应吩咐行参数输入方式,操作吩咐详见教材第1章。程序通过main(Stringargs)方法的args参数获得吩咐行参数输入的以空格分隔的多个字符串,见教材第1章例1.1。标准输入运用标准输入常量System,in调用InputStream字节输入流类的read。方法获得从键盘输入的数据,要处理异样。异样和流的基本概念详见教材第5、9章,例见教材例2.10和以下习2.7。图形用户界面从图形用户界面的文本行等编辑组件中可获得输入数据,详见教材第6章。上述三种方式输入的数据都是String类型。假如要输入数值数据,就先输入字符串,再将字符串转换成数值。3 .将数值字符串转换成相应数值23i怎样将数值字符串转换成其所表示的整数或浮点数数值?【答】调用java.lang.Integer类的以下静态方法parselnt(三)将字符串S转换成十进制整数。publicstaticintparselnt(Strings)throwsNumberFormatException调用java.lang.DOUble类的以下静态方法ParSeDOUbIe(三)将字符串S转换成浮点数值。publicstaticdoubleparseDoub1e(Strings)throwsNumberFormatException假如字符串不能转换成整数或浮点数,将抛出数值格式异样。详见教材第45章。【习2.3获得实数字符串表示的浮点数值。本例实现java.lang.Double类中ParSeDoUbIe(三)方法,从实数字符串获得其表示的浮点数值。给出两种算法。由数字序列和运算符构造实数,语法如图2.6所示。ID2.6由数字序列和运算符构造实数的语法图声明MyDouble类如下,其中ParSeDOUbIe(String)方法由数字序列和运算符构造实数。publicclassMvDouble返回实数字符串表示的浮点数值,由图26所示数字序列和运算符语法构造实数PUbIiCstaticdoubleparseDouble(Strings)inti=0,Sign=S.charAt(0)=',?-1:1;/sign记住符号位if(s.charAt(O)='+'IIs.charAt(O)-,)跳过符号位i+;doublevalue=O,power=0.1;/power表示底数为10的第while(i<s.IengthO&&s.chart(i)>=*0,&&s.CharAt(i)<=9,)获得整数部分值value=value*10+s.charAt(i+),0,;if(i<s.IengthO&&s.charAt(i)='.,)若是小数点i+;while(i<s.length()&&s.charAt(i)>=,O'&&s.charAt(i)<,9,)获得小数部分值(value+=(s.chart(i)-,0,)*power:i+;power*=0.1;value*=sign;if(i<s.length()&&(s.charAt(i)=,E>s.charAt(i)='e')/处理阶码i+:power=(s.charAt(i)=三,-')?O.1:10;阶码的符号位确定指数的正负及其运算if(s.chart(i)=三,+,|s.chart(i)=f-')i+;intexp=O;whiIe(i<s.length()&&s.charAt(i)>=O'&&s.charAt(i)<=*9')exp=exp*10+s.charAt(i+)-'0,;获得指数的肯定值for(intj=0;j<exp;j+)value*=power;returnvalue;由整数、数字序列和运算符构造实数,语法如图2.8所示。B12.7由整数、数字序列和运算符构造实数的语法图在MyDOUbIe类增加IoDouble(String)方法如下,由整数、数字序列和运算符构造实数。返回实数字符串表示的浮点数值,由图2.8所示整数、数字序列和运算符语法构造实数publicstaticdoubletoDouble(Strings)返回实数字符串表示的浮点数值intj=s.indexf(,.,),k=s.indexfCE,);/找寻小数点和Eif(k=-l)k=s.indexf(,e,);if(j=-l&&k=-l)returnMyInteger.parselnt(三);/s中没有小数和阶码部分,获得整数值返回inti=0,sign=s.charAt(O)=''?-1:1;/sign记住符号位if(s.charAt(O)=1÷,s.CharAt(O)=,->)/跳过符号位i+;doublevalue=0,power=0.1;/power表示底数为10的舞if(j!=-D/s中有小数部分Value=MyInteger.parselnt(s.substring(i,j);获得正整数部分值J+:/跳过小数点whi1e(j<s.IengthO&&s.charAt(j)>=f0'&&s.charAt(j)<='9')获得小数部分值(value+=(s.ChaMt(J)-*0,)*power;+;power*=0.1;value*=sign;if(k!=-l)处理阶码if(j=-l)/s中没有小数部分Value=Mylnteger.parselnt(s.substring(0,k);获得整数部分值k+;power=(s.charAt(k)=,->)?0.1:10;阶码的符号位确定指数的正负及其运算if(s.charAt(k)=,+,IIs.charAt(k)=,-,)k+;intexp=MyInteger,parselnt(s.substring(k);获得指数部分的正整数值for(j=0;j<exp;j+÷)value*=power:returnvalue;程序运行结果如下:ParseDouble-12345.67E-2")=-123.45670000000001,toDouble(*-12345E2*)=-1234500.04 .将二进制形式字符串数值字符串转换成相应数值整数2-32怎样从二、八、十六进制字符串中读取整数值?【答】调用java.lang.Integer类的以下方法parselnt(s,radix)将字符串s转换成radix进制整数。PUbliCstaticintparselnt(Strings,intradix)throwsNumberForinatException5 .将整数转换成二、八或十六进制形式字符串2-33怎样将整数转换成以二进制、八进制或十六进制形式字符串?JString,format(Stringformat,Object.args)方法返回format指定格式的字符串,飞。"、飞x”分别指定八进制、十六进制整数格式。java.lang.Integer类声明以下方法,分别返回整数的二、八、toBinaryString(inttoOctalString(inttolIexString(int例如:i)i)i)十六进制形式字符串。publicstaticString将i转换成二进制字符串publicstaticString将i转换成八进制字符串publicstaticString将i转换成十六进制字符串上述方法返回的字符串不包括高位0。Integer.IoBinaryString(128)运算结果为10000000【习2.4】整数的.进制问题探讨。在教材例2.10声明的MyInteger类中增加toBinaryString(int)等方法,返回整数的:、八、十六进制形式字符串等功能。本例以下分别探讨采纳“除2取余法”和位运算的算法设计问题。除2取余法转换成二进制字符串2-34以下方法有什么错误?为什么?publicstaticStringtoBinaryString(intvalue)/返回正整数VaIUe的二进制字符串,除2取余法Stringstr=*:while(value>0)除2取余法,余数存入Str字符串(逆序)str=value%2+str;/value%2+str即(char)(value%2+*0,)+strvalue/=2;returnstr;返回字符串【答】上述算法仅当ValUe>0时正确:当ValUeWo时错误,返回为适用于负数,将上述算法修改如下。2-35以下方法有什么错误?为什么?publicstaticStringtoBinaryString(intvalue)返回整数ValUe的二进制字符串,除2取余法if(value=0)return"0"Stringstr="”;while(value!=0)除2取余法,余数存入SIr字符串(逆序)for(inti=buffer.Iength-I;i>=0:i)循环执行32次,高位补0bufferi=(char)(value&l)+'0');/获得个位字符存入数组。&运算符优先级低于十value>>>=l;/value右移一位,高位以0填充,叫YalUC除以2returnnewString(buffer);/返回由字符数组构造的字符串其中,VaIUe&1运算结果为0或1:(value&l)+'0'运算结果为48或49,表示'0'或'1'的编码值;(Char)(VaIUe&1)+'0')运算结果为0'或'T,即获得value的个位字符。上述算法逐个获得value的个位字符,存入buffer数组。算法描述见教材图2.23所示。调用语句如下:System.out.printin(wMyInteger.IOBinaryString("+n+")="+MyInteger.toBinaryString(n);多次运行结果如下:MyInteger.toBinaryString(126)00000000000000000000000001111110MyMy【思索题】实现以下方法。publicstaticStringtoOctalString(intvalue)返回整数value的八进制字符串publicstaticStringtoHexString(intvalue)返回整数value的十六进制字符串(3)位运算,转换成radix进制字符串MyInteger类增加声明toString(inlvalue,iniradix)方法如卜,算法实现见教材例2.10。/返回整数VaIUe的radix进制字符串,radix取值为2、4、8、10、16。采纳位运算publicstaticStringtoString(intvalue,intradix)调用语句如下:intvalue=Integer.M1N_VA