日期:2014-05-20  浏览次数:20722 次

i值为什么是0
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?

------解决方案--------------------
主方法中的i与add3方法中的i是存放在不同内存区域中的,是两个不同变量,只是名字相同罢了,希望搂主看看静态变量的定义与使用就能搞定了。在学校时自学过一点JAVA,已经忘的差不多了。
------解决方案--------------------
//这样应该会清楚一点.
1)public class Test{
2) public static void add3(Integer y){ //这里的y指向的内存空间和main()方法中i指向的空间是同一 ///////////////////////////////////////////////个空间
3) int val=y.intValue();//这里只是取出值,没有对内存空间进行修改.
4) val = val + 3;
5) y=new Integer(val); //这里新建了一个integer对象,把引用附给了y.
6) }
7) public static void main(String args[]){
8) Integer i=new Integer(0);
9) add3(i);
10) System.out.println(i.intValue());//这里的i还是第8行的i,指向的内存空间没有变,内存空间也没有被/////////////////////////////////////////修改,所以输出是0.
11) }
12)}
------解决方案--------------------
1)public class Test{
2) public static Integer void add3(Integer i){
3) int val = i.intValue();
4) val = val + 3;
5) Integer ii = new Integer(val);
return ii;
6) }
7) public static void main(String args[]){
8) Integer i=new Integer(0);
9)
10) System.out.println(add3(i).intValue());
11) }
12)}
------解决方案--------------------
你看下面的代码就知道了

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);
}
}
------解决方案--------------------
如果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的对象,那么函数对形参的操作,永远不会影响到实参。
------解决方案--------------------
wuhaozhiyuan() ( ) 信誉:100 是正确的

这里并不是值传递和引用传递的问题
刚开始main方法中的 i 和 add()方法中参数i 都指向的是同一个内存空,
但是 5) i=new Integer(val); 这一句改变了参数 i 所指向的内存空间,
而 main方法中的 i 还是指向原来的内存空间,并没有改变,所以仍然是 0