Java中关于Integer的疑问?

[复制链接]
查看11 | 回复10 | 2011-9-15 03:54:42 | 显示全部楼层 |阅读模式
packageInt;importjava.io.OutputStreamWriter;publicclassIntegerTest{voidzijia(Integeri){i=8;}publicstaticvoidmain(String[]args){Integeri=1;i;System.out.println(i);IntegerTesta=newIntegerTest();a.zijia(i);System.out.println(i);}}为什么结果是两个2
回复

使用道具 举报

千问 | 2011-9-15 03:54:42 | 显示全部楼层
Java中行参的传递是值传递形参i的值传过去后,产生一个指向i的引用副本(暂另其为i1),但是i1=8相当于i1=newInteger(8)产生了一个新对象,而i1现在所指向的就是这个新的对象,i1有了新的地址,和原来的对象再也没有了关系,在main函数中,第二个System.out.println(i);中的i仍是不是i1,因此打印的对象仍然是i;此问题重要的是理解1.值传递2.i1=8相当于i1=newInteger(8)产生了一个新对象
回复

使用道具 举报

千问 | 2011-9-15 03:54:42 | 显示全部楼层
传值的时候分为:形参和实参。形参i的值传过去后,是那个函数的局域变量,可以改变,但不会影响原函数中实参i的值。必须返回修改过的值,才能打印你想要的结果。追问传值传过去的是对象,是引用!
回复

使用道具 举报

千问 | 2011-9-15 03:54:42 | 显示全部楼层
publicclassTest{voidzijia(MyIntegeri){i.i=8;}publicstaticvoidmain(String[]args){MyIntegeri=newMyInteger();i.i=1;i.i;System.out.println(i.i);Testa=newTest();a.zijia(i);System.out.println(i.i);}}classMyInteger{publicIntegeri;}这个的打印结果是:2,8因此这可以说明,Integer、String等基本类,只是赋一个值而已,不是传地址。虽然是引用,我也不清楚啊,研究。。。。。。
回复

使用道具 举报

千问 | 2011-9-15 03:54:42 | 显示全部楼层
publicstaticvoidmain(String[]args){Integeri=1;i;System.out.println(i);//这里输出的是2IntegerTesta=newIntegerTest();a.zijia(i);System.out.println(i);//这里也是2,为什么呢,因为zijia(i);这个方法没有返回值,因为是void,所以无返回值.输出是2不是8}
回复

使用道具 举报

千问 | 2011-9-15 03:54:42 | 显示全部楼层
voidzijia(Integeri){i=8;}注意此时的i是局部变量,不是成员变量,出了就无效了你这样写就知道了publicclassIntegerTest{staticIntegeri=1;voidzijia(Integeri){this.i=8;//this去掉试试}publicstaticvoidmain(String[]args){i;System.out.println(i);IntegerTesta=newIntegerTest();a.zijia(i);System.out.println(i);}}
回复

使用道具 举报

千问 | 2011-9-15 03:54:42 | 显示全部楼层
原因很简单,main函数中的i和IntegerTest类中zijia()函数中的i存放在不同的内存中,例如,在main函数定义的i的存放地址为00xx0001,调用IntegerTest类中zijia()时,只是简单的将这个内存的值赋给zijia()函数的参数,而这个参数的存放地址为00xx0002,自加用值为3,也是存放在这个地址上。但是你输出的对象是main函数定义的i,即你输出的是存放在00xx0001地址上的值,所以结果都是2
回复

使用道具 举报

千问 | 2011-9-15 03:54:42 | 显示全部楼层
我想第一个2不用说了吧?咱说说第二个。你看在\"a.zijia(i)“这个中,你是调用了zijia这个方法是吧?那么你的疑问一定是为什么i还是2而不是8,我们可以这么看,在这个方法里面i的确是8,但是这个8只是局限在这个方法里,它没有将它传递出去,所以不会影响外面的值。这个是一个比较通俗的说法。如果你想要显示一个2一个8,那么可以这么改:首先,让方法的值传递出去intzijia(Integeri){i=8;returni;//传递出i的值}第二,在外部接收i=a.zijia(i);这样就可以了。如果还有什么疑问可以提。
回复

使用道具 举报

千问 | 2011-9-15 03:54:42 | 显示全部楼层
是不是没有返回值的缘故呀?把voidzijia(Integeri)处的void改成int试试看。
回复

使用道具 举报

千问 | 2011-9-15 03:54:42 | 显示全部楼层
算了还是我这个6年没碰JAVA的人来给你解答Lz你疑惑的应该是JAVA里面对于对象都是按引用传递的为什么缺改变不了这个INT的值那是因为Integer虽然是按引用传递的但是他很特别他没有实现有用于可以修改引用所指向值的方法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行