奇怪了,Integer不是对象吗,?为什么不按引用传递的

r4141496091 2009-08-19 08:22:31
public class test{

public static void main (String[] args) {
test t=new test();
Integer i=new Integer(20);
System.out.println(i);
t.changevalue(i);
System.out.println(i);
}
public void changevalue(Integer t){
Integer x=new Integer(34);
t=x;
}
}

输出:
20
20


...全文
599 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员猪佩琪 2009-08-21
  • 打赏
  • 举报
回复
建议楼主,把变量,对象存在那个内存先看看!
zhuzhusany 2009-08-21
  • 打赏
  • 举报
回复
同意15楼的说话,不建议说java就是传值的,这样很容易让人产生误解(会把基本类型的传值混淆),对象做为参数,当然是传递的是该对象的引用,只不过复制了该引用的一个的拷贝,或者说不允许对改引用进行重新赋值(在C++中这样是可以的,甚至可以改变指针的偏移量,但java是不允许的),所以当改变引用的指向对象的内部状态或者属性是完全可以的例如:

public class Test {
public static void main(String[] args) {
StringBuilder str = new StringBuilder("string");
changeStr(str,1);// 重新赋值在改变他的状态,输出还是string
System.out.println(str);
changeStr(str,0);// 直接改变他的状态,输出newString
System.out.println(str);
}

public static void changeStr(StringBuilder str,int changeFlag) {
String newString = "newString";
if(changeFlag == 1) {
str = new StringBuilder(newString); // 指向了新对象
str.replace(0, str.length(), newString);// 改变新对象的状态,并没有影响实参对象的状态
} else {
str.replace(0, str.length(), newString);
}
}
}

当然如果对象作为参数要改变他内部状态的话,该对象必须是mutable的,如果是String那么是无法被改变的
Integer同样是immutable的,不过可以通过反射来改变immutable的状态
haojian11 2009-08-21
  • 打赏
  • 举报
回复
当执行t.changevalue(i);的时候,jvm自动创建了一个局部变量,假设为i1;然后把i1也指向了i指向的对象,并把i1当做参数传入,并不是传入i,此时在 changevalue方法内起作用的引用是i1,不会影响到i。
cxz7531 2009-08-21
  • 打赏
  • 举报
回复 3
public void changevalue(Integer t){
Integer x=new Integer(34);
t=x;
}
Integer做参数的时候传递的是引用,引用i赋值给引用t,i和t是两个独立的引用,但指向同一个Integer对象A。
你在changevalue方法中执行Integer x=new Integer(34);就创建了另一个Integer对象B及其引用x,执行t=x后,t也指向了这个对象B。但对象A内容没有变化,引用i也没有变化。
tuanfuyao2008 2009-08-21
  • 打赏
  • 举报
回复

执行到这里时:
public void changevalue(Integer t){

i和t是两个引用,都指向一个对象 new Integer(20);

执行到这里时:
Integer x=new Integer(34);
t=x;

引用t指向了对象 new Integer(34);
而引用i 还指向new Integer(20);

所以 System.out.println(i); 打印20
dbsshida 2009-08-21
  • 打赏
  • 举报
回复
這種問題考都考過N次了,java只有值傳遞,想把方法裡的值傳出來,除非用return返回它的值,再在你想用的地方用變量接收
dz007 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zangxt 的回复:]
引用 12 楼 r4141496091 的回复:
都胡说的!!!!没讲到点子上,难道csdn真的那么多菜鸟吗?

太搞了,你还没有判断能力。
[/Quote]

i的确是一个引用,不过传递的时候auto-unboxing把缓存里的值地址传过去了,是这么理解的么?
lxxzhy 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 r4141496091 的回复:]
都胡说的!!!!没讲到点子上,难道csdn真的那么多菜鸟吗?
[/Quote]

同学,已经有很多位同学讲到点子上了,真的.
xuweifeng0323 2009-08-20
  • 打赏
  • 举报
回复
传值还是引用只是每个人的理解不同,这在C中也是同样的结果,搞清楚栈和堆就理解了
skyair2004 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 skyair2004 的回复:]
public  void changevalue(Integer t){
    Integer x=new Integer(34);
    t=x;
    }
你用这个方法 传进来
Integer x = 10;了
然后  t=10;
这是内存里面的做法
[/Quote]
对不起楼上说错了
Integer x = 34
t=34
ZangXT 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 r4141496091 的回复:]
都胡说的!!!!没讲到点子上,难道csdn真的那么多菜鸟吗?
[/Quote]
太搞了,你还没有判断能力。
skyair2004 2009-08-20
  • 打赏
  • 举报
回复
就如我楼上说的.你答应的是i 根本没改变
izard999 2009-08-20
  • 打赏
  • 举报
回复
Java的传参机制就是值传. 基本数据类型是copy值,引用类型就是copy这个对象的地址. 就是说这个时候实参和形参指向同一个对象, 你方法里面让形参指向一个新对象,对实参无任何影响..
skyair2004 2009-08-20
  • 打赏
  • 举报
回复
public void changevalue(Integer t){
Integer x=new Integer(34);
t=x;
}
你用这个方法 传进来
Integer x = 10;了
然后 t=10;
这是内存里面的做法
dz007 2009-08-20
  • 打赏
  • 举报
回复
Integer 的确是个奇怪的东西,网上相关的信息也比较少
r4141496091 2009-08-20
  • 打赏
  • 举报
回复
都胡说的!!!!没讲到点子上,难道csdn真的那么多菜鸟吗?
david2083 2009-08-20
  • 打赏
  • 举报
回复
能改变 Integer 值的方法

import java.util.*;
import java.text.*;
import java.lang.reflect.*;

public class t
{
public static void main(String[] args) throws Exception{

String abc = "abc";

System.out.println(abc);
upper(abc);
System.out.println(abc);

Integer a = 3;
inc(a);
System.out.println(a);
Integer b = 3;
System.out.println(b);
System.out.println(3);


}


public static void inc(Integer abc) throws Exception
{
Field f = abc.getClass().getDeclaredField("value");
f.setAccessible(true);
f.setInt(abc,abc+1);
}
public static void upper(String abc) throws Exception
{
Field f = abc.getClass().getDeclaredField("value");
f.setAccessible(true);
char[] cc = (char[])f.get(abc);
for(int i=0;i<cc.length;i++)
if(cc[i]>='a' && cc[i]<='z')
cc[i] = (char)(cc[i] + ('A'-'a'));
}
}
zongyajun 2009-08-20
  • 打赏
  • 举报
回复
问题在于 你不够理解 对象和引用
t=x; 这句话根本不起作用.
t = new Integer(x);你更容易理解, t 的作用域只在方法体内,出了方法体就没用了.
jzinfo 2009-08-20
  • 打赏
  • 举报
回复
值传递。。。
加载更多回复(8)

62,621

社区成员

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

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