我被我的同学问住了,关于Integer的引用,大家帮忙看看
Integer i1,i2;
i1=5;
i2=i1;
i1=7;
System.out.println(i2);
答案是5,但是Integer是对象所以i2=i1因该是引用,所以i1=7以后i2因该也等于7
java水平很菜,不知道该如何解释。在javaEye中看到过关于字符串对象有常量池
这个概念,但是套到这里好像不合适,毕竟Integer不向字符串一旦生成就不可改变,
改变后就重新在内存中生成。
[b]问题补充:[/b]
Integer i1,i2;
i1=5;
i2=i1;
i1=7;
System.out.println(i2);
答案是5,但是Integer是对象所以i2=i1因该是引用,所以i1=7以后i2因该也等于7
java水平很菜,不知道该如何解释。在javaEye中看到过关于字符串对象有常量池
这个概念,但是套到这里好像不合适,毕竟Integer不向字符串一旦生成就不可改变,
改变后就重新在内存中生成。
我现在基本上明白了,i2=5是合理的,因为i1由原来的Integr(5)变成了Integer(7)地址改变了,而i2还是原来的地址。以前看到过一篇文章是将字符串对象、常量池这些,而且字符串每
进行一次赋值就需要重新生成一个对象然后重新对字符串变量进行赋值。我当时以为只有字符串会这样而
Integer等包装类是不需要的,因为每一个包装类都有一个基本类型属性,改变值只需要改变属性值就可以
了,今天早上查了下api发现这些包装类都没有set方法可以改变基本类属性!,原来对这些包装类的改变
也和字符串一样是通过new一个新对象来实现的。来这公司写jsp也有小半年了,我同学刚学java两天问了
个问题就把我问倒了,想起来真有些惭愧。不过也好把事情弄清楚了,谢谢各位的热心解答!
针对你的那个具体问题:
[code="java"]Integer i1,i2;
i1=5;
i2=i1;
i1=7;
System.out.println(i2);[/code]
第一步:
i1----->null
i2----->null
第二步:
i1----->Integer(5)<-----i2
第三步:
Integer(5)<-----i2
i1----->Integer(7)
所以输出是5
你这个问题其实是Java是传值还是传引用的问题,这里有比较详细的介绍:
[url]http://www.bccn.net/Article/kfyy/java/jszl/200601/3069.html[/url]
你还可以看看老外的解释:
Does Java pass by reference or pass by value?
[code="java"]http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html[/code]
这里有个翻译版本:
[url]http://www.iteye.com/topic/202512[/url]
Java中只有按值传递,没有按引用传递!
[code="java"]
Integer i1,i2;
i1=5;
i2=i1;
i1=7; ----》开辟了新的内存空间
System.out.println(i2);
[/code]
[code="c"]
int num5 = 5;
int num7 = 7;
int *i1;
int *i2;
i1 = &num5;
i2 = i1;
[color=red]i1 = &num7;[/color]
printf("%d", i2);
[/code]
而你想要的效果是:
[code="c"]
int num5 = 5;
int num7 = 7;
int *i1;
int *i2;
i1 = &num5;
i2 = i1;
[color=red]*i1 = num7;[/color]
printf("%d", i2);
[/code]
注意是 *i1 = num7; 还是i1 = &num7;
java里面不允许通过地址访问内存,所以是没有*i1的