i值为什么是0

hs0925 2007-08-20 10:26:02
1)public class Test{
2) public static void add3(Integer i){
3) int val=i.intValue();
4) val = val + 3;
5) i=new Integer(val);
6) }
7) public static void main(String args[]){
8) Integer i=new Integer(0);
9) add3(i);
10) System.out.println(i.intValue());
11) }
12)}
为什么第10行打印出来为0?
...全文
793 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
frank3G 2007-08-21
  • 打赏
  • 举报
回复
值传递的问题 ,传递的是i的值不是i的地址,怎么可能改变i呀
raycome 2007-08-21
  • 打赏
  • 举报
回复
应该是这个i=new Integer(val)惹得祸吧,i的指赋给了一个新的对象了。
private777 2007-08-21
  • 打赏
  • 举报
回复
在add3()方法里引用i确实指向了一个新的对象,add3()方法返回后,引用i仍然指向main()方法
的那个对象.
百年孤独 2007-08-21
  • 打赏
  • 举报
回复
还有
add3(i);
也是不对 的
应该把值赋予i=add3(i);
Easy618 2007-08-21
  • 打赏
  • 举报
回复
你这是值传递 不是地址传递
百年孤独 2007-08-21
  • 打赏
  • 举报
回复
public class Test{
public static Integer add3(Integer i){
//这里定义的无返回类型,怎么可能让i加三呢???!!!
int val=i.intValue();
val = val + 3;
i=new Integer(val);
return i;
}
public static void main(String args[]){
Integer i=new Integer(4);
i=add3(i);
System.out.println(i.intValue());
}
}
yinx 2007-08-21
  • 打赏
  • 举报
回复
传值调用
joejoe1991 2007-08-21
  • 打赏
  • 举报
回复
我汗 没有看见
i=new Integer(val);这句话 。。。
beibeiG 2007-08-21
  • 打赏
  • 举报
回复
wuhaozhiyuan() ( ) 信誉:100 是正确的

这里并不是值传递和引用传递的问题
刚开始main方法中的 i 和 add()方法中参数i 都指向的是同一个内存空,
但是 5) i=new Integer(val); 这一句改变了参数 i 所指向的内存空间,
而 main方法中的 i 还是指向原来的内存空间,并没有改变,所以仍然是 0
wddlqd 2007-08-20
  • 打赏
  • 举报
回复
add3(i)传的只是i的值,而不是地址,所以所作的操作不修改i
leaf__leaf 2007-08-20
  • 打赏
  • 举报
回复
一句话,main中的i还是指向原来的那个对象,而不是指向在函数体里新生成的那个。
leaf__leaf 2007-08-20
  • 打赏
  • 举报
回复
如果LZ想它打出来的不是0,那只有一个办法,改变它指向的对象。
一般的话,可以改变它指向的对象的状态,或者干脆让它指向另一个对象,都有效。但很明显,Integer是immutable的,不可变,所以前者不可行。于是LZ这段代码的目的就是想通过后者来实现的吧!
原因用C++里的指针来解释会更好办点。Java里的参数,不论是对象还是基础类型,全是传值。基础类型就没什么好说的,对象则是把指针,就是对象在内存中的地址,传递给函数体。
假设,Java中的指针是一个long型的变量,那么函数add3在执行时相当于add3(long i)。main中的i相当于long i = <new出来的对象的内存地址>。假设这个地址是@1,那么main中的i=@1。之后函数调用是add3(@1),形参i被赋值@1。在函数中,形参i又被赋予了新生成的对象的内存地址(假设它是@2),形参i=@2。但是实参,即main中的i,其值还是@1。
虽然原理和以上有点差别,但差不多吧!如果参数是个long型的变量,是不是会比较好理解?
在这点上,Java会比C++麻烦点。在Java中,如果参数是immutable的对象,那么函数对形参的操作,永远不会影响到实参。
elvis_gao 2007-08-20
  • 打赏
  • 举报
回复
主方法中的i与add3方法中的i是存放在不同内存区域中的,是两个不同变量,只是名字相同罢了,希望搂主看看静态变量的定义与使用就能搞定了。在学校时自学过一点JAVA,已经忘的差不多了。
tdy1234 2007-08-20
  • 打赏
  • 举报
回复
值传递的问题 ,传递的是i的值不是i的地址,怎么可能改变i呀
whisper0429 2007-08-20
  • 打赏
  • 举报
回复
add3()和main方法,各有一个局部变量i,add3()的i改变,不影响main里的i的值
wangyananlove 2007-08-20
  • 打赏
  • 举报
回复
public static void add3(Integer i){ }

没有返回任何数值,而且i不是静态变量,肯定不能改变main函数中i的值

  • 打赏
  • 举报
回复
形参和实参的区别。
yangxccom 2007-08-20
  • 打赏
  • 举报
回复
由于Integer类的对象为不可变对象的因原吧
eidolon_warrior 2007-08-20
  • 打赏
  • 举报
回复
基本的语法 ....
add3(i);实际对main中的i没有任何影响
qqqwwwqw 2007-08-20
  • 打赏
  • 举报
回复
你看下面的代码就知道了

class A
{
//传递的是引数,既是i指向了in;
public static void add(Integer i){
int val = i.intValue();
val += 3;
//建立一个引用,等于i,也是指向in。
Integer integer = i;
System.out.println(i == integer);
//这时把引用i指向了另一个对象,所以实际上是根本没有改变in的值,打出来对象也不是一个啊
i = new Integer(val);
System.out.println(i == integer);



}
public static void main(String[] args){
Integer in = new Integer(0);
A.add(in);
System.out.println(in);
}
}
加载更多回复(7)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧