java练习题(含答案)_第1页
java练习题(含答案)_第2页
java练习题(含答案)_第3页
java练习题(含答案)_第4页
java练习题(含答案)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

java练习题(含答案)java练习题(含答案)java练习题(含答案)java练习题(含答案)编制仅供参考审核批准生效日期地址:电话:传真:邮编:编写程序,用数组实现乘法小九九的存储和输出。【提示:采用多个一维数组。】publicclassMultipation{ publicstaticvoidmain(String[]args){ 定义一个类Student,属性为学号、姓名和成绩;方法为增加记录SetRecord和得到记录GetRecord。SetRecord给出学号、姓名和成绩的赋值,GetRecord通过学号得到考生的成绩。publicclassStudent{ /** *@paramargs */ privateintID; privateStringname; privatefloatscore; publicvoidSetRecord(intID,Stringname,floatscore){ =ID; =name; =score; } publicfloatgetRecord(intID){ if(ID== return; else return-1; } publicstaticvoidmain(String[]args){ 编写程序,测试字符串“你好,欢迎来到Java世界”的长度,将字符串的长度转换成字符串进行输出,并对其中的“Java”四个字母进行截取,输出截取字母以及它在字符串中的位置。publicclassStringTest{ /** *@paramargs */ publicstaticvoidmain(String[]args){ 自己设计一个坐标类,能提供以下方法如求当前坐标和其他坐标之间的距离等方法,要求所有变量为私有变量,并提供两个构造函数。publicclassXYdistance{ privateintx; privateinty; XYdistance(){ setX(0); setY(0); } publicvoidsetX(intx){ =x; } publicintgetX(){ returnx; } publicvoidsetY(inty){ =y; } publicintgetY(){ returny; } publicstaticvoidmain(String[]args){ lass文件中的一些数据。JVM虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(String,Integer和Floatingpoint常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的,对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。

1、Strings="abc";

创建过程分析:在class文件被JVM装载到内存中,JVM会创建一块StringPool(String缓冲池)。当执行Strings=“abc”;时,JVM首先在StringPool中查看是否存在字符串对象“abc”(如何查看呢用equals()方法判断),如果已存在该对象,则不用创建新的字符串对象“abc”,而直接使用StringPool中已存在的对象“abc”,然后将引用s指向该对象;如果不存在该对象,则先在StringPool中创建一个新的字符串对象“abc”,然后将引用s指向StringPool中创建的新对象。

注意:使用“字符串常量”引号创建的字符串对象时,在编译期就已经确定将该对象存储到StringPool中了。因此,Strings=“abc”只会在编译期,在StringPool中创建一个对象。

例如:Java代码

String

s1

=

"abc";

String

s2

=

"abc";

==

s2);返回了一个String对象,也就是说在堆中创建了对象。这时候会不会在池中出现"abc"这个对象呢(question还没解决)

生成Strings的过程中,编译器使用sb执行的过程:创建一个StringBuffer对象,使用append()向此StringBuffer对象直接添加新的字符串(而不是每次制作一个新的副本)。

对于Stringc="c";Strings="a"+"b"+c;,编译器将会先将"a"+"b"作为编译时常量,优化生成成字面常量"ab",然后生成一个StringBuilder对象,接着调用两次append()方法,即:

Strings=newBuilder().append("ab").append(c).toString();

对于Stringa="a";Strings=a+"b"+"c";,编译器分析a为引用变量,后面的"b"+"c"就不会作为编译时常量来运算了。相当于执行:

Strings=newBuilder().append(a).append("b").append("c").toString();

对于Stringb="b";Strings="a"+b+"c";],这种形式的就没办法优化了,直接生成StringBuilder对象,然后调用三次append()方法,即:

Strings=newBuilder().append("a").append(b).append("c").toString();

接着,我们再看以下代码:Java代码

String

str1

=

"abc";.,只要在java里面有关键字new存在,不管内容是否相同,都表示它将生成一个新的对象,new多少次,就生成多少个对象,而且新生成的对象都是在Heap里面,所以它会在Heap里面生成一个内容为abc的对象,并且将它的地址赋给了引用s3,s3就指向刚在Heap里面生成的内容为abc的对象。所以,当执行完语句(3)时,内存里面一共有3个对象,其中包含了在StringPool里面一个内容为abc的字符串对象和在Heap里面包含了两个内容为abc的字符串对象。

问题4:当执行完语句(4)(5)(6)后,它们的结果分别是什么

在java里面,对象用"=="永远比较的是两个对象的内存地址,换句话说,是比较"=="左右两边的两个引用是否指向同一个对象。对于java里面的8种原生数据类型来说,"=="比较的是它们的字面值是不是一样的;对应用类型来说,比较的是它们的内存地址是不是一样的。在语句(1)(2)(3)中,由于s1、s2、s3指向不同的对象,它们的内存地址就不一样,因此可以说当执行完语句(4)(5)(6),它们返回的结果都是false。

问题5:当执行完语句(7)(8)(9)后,它们的结果分别是什么

首先,s1这个对象指向的是堆中第一次new...生成的对象,当调用intern方法时,如果StringPool已经包含一个等于此String对象的字符串(该对象由equals(Object)方法确定),则返回指向StringPool中的字符串对象的引用。因为StringPool中有内容为abc的对象,所以()返回的是StringPool中的内容为abc的字符串对象的内存地址,而s1却是指向Heap上内容为abc的字符串对象的引用。因而,两个引用指向的对象不同,所以,s1==()为false,即语句(7)结果为false。

对于(),它还是会首先检查StringPool中是否有内容为abc的对象,发现有,则将StringPool中内容为abc的对象的地址赋给()方法的返回值。因为s2和()方法的返回值指向的是同一个对象,所以,s2==()的结果为true,,即语句(8)结果为true。

对于(),它首先检查StringPool中是否有内容为abc的对象,发现有,则将StringPool中内容为abc的对象的赋给()方法的返回值。对于(),首先检查StringPool中是否有内容为abc的对象,发现有,则将StringPool中内容为abc的对象的地址赋给()方法的返回值。因为两者返回的地址都指向同一个对象,所以,()==()的结果为true,,即是语句(9)结果为true。

因此,当执行完语句(7)(8)(9)后,它们的结果分别是false、true、true。

问题6:当执行完语句(13)(14)(15)(16)后,它们的结果分别是什么

hello=="hello"引用hello指向的对象就是StringPool中的“hello”,即语句(13)的结果为true。

hello=="hel"+"lo"当加号两边都是常量值时,就会组成一个新的常量值"hello"在StringPool里面,如果StringPool已经有相同内容的就不会再创建,则直接返回StringPool里面的内容为"hello"的字符串对象的内存地址,所以,hello=="hel"+"lo"结果为true。

hello=="hel"+lo当加号两边有一个不是常量值,会在堆里面创建一个新的"hello"对象,一个在StringPool中,一个在Heap中,故输出false。

hel+lo同上,输出false。

因此,当执行完语句(7)(8)(9)后,它们的结果分别是true、true、false、false。

例程7:Java代码

String

s1

=

"abc";

String

s2

=

new

String("abc");

String

s3

=

new

String("abc");

();ppend("a").append(newString("bc")).toString();

思考:Strings="a"+newString("b")+"c";产生了那几个对象

解:等价于Strings=newStringBuilder().append("a").append(newString("b")).append("c").toString(),会在StringPool中产生"a"、"b"、"c"三个对象,在Heap中产生"b"、"abc"两个个对象。一共5个字符串对象。

例程9:Java代码

String

s1

=

"Hello";

s1

=

"Java";

String

s2

=

"Hello";

String

s3

=

new

String("Hello");

==

s2);

==

s3);

运行结果如下:

false

false

分析这段程序的执行过程:

首先在加载Java程序时,JVM会创建一片的内存空间(StringPool)专门存入string对象。

Strings1="Hello",现在栈中创建一个字符串引用s1,然后JVM会在StringPool中查找是否存在"Hello",如果存在,则直接使用它,将其地址赋给s1,如果不存在(这时StringPool中显然不存在"Hello"),则在StringPool中创建"Hello",并将其地址赋给s1。

s1="Java",JVM会在StringPool中查找是否存在"Java",如果存在,则直接使用它,将其地址赋给s1,如果不存在(这时StringPool中显然不存在"Java"),则在StringPool中创建"Java",并将其地址赋给s1。而原来的字符串对象"Hello"仍然在StringPool中,没有消失,因为String对象的值是不能被修改的。这里只是改变了引用的值即引用指向的对象的地址,而没有改变它所引用的对象。

Strings2="Hello",JVM会在StringPool里查看有没有字符串"Hello",若有,则返回它的地址给s2,否则,创建新的String对象"Hello",放到StringPool里。这里由于"Hello"对象已经创建,并存在于StringPool中,因而不需要重新创建String对象"Hello"。此时s1指向StringPool中的"Java",s2指向StringPool中的"Hello",故s1==s2的值为false。

Strings3=String("Hello"),JVM会在StringPool里查看有没有字符串"Hello",若有,直接执行new操作,若没有,则先要在StringPool中创建"Hello",然后执行new操作,由于遇到了new,还会在Heap上(不是StringPool里)创建string对象"Hello",并将Heap上的"Hello"对象的地址赋给引用s3。所以s2==s3将返回false,因为s2和s3不是引用同一个对象。

以上小结如理解有误,希望各位高手指教!写代码验证静态代码块被自动执行,就算产生了类的多个实例对象,但其中的静态代码块只被执行了一次。classParent{ staticStringname="hello"; { "parentblock"); } static{ "parentstaticblock"); } publicParent(){ "parentconstructor"); }}classChildextendsParent{ staticStringchildName="hello"; { "childblock"); } static{ "childstaticblock"); } publicChild(){ "childconstructor"); }}publicclassTextStatic{ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub newChild();//语句(*) newChild(); }}运行结果:parentstaticblockchildstaticblockparentblockparentconstructorchildblockc

温馨提示

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

评论

0/150

提交评论