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
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
如果以传参的形式来改变的话,除非对其进行另外的封装,或放在数组里,否则无论怎么修改都不会改变原有的值的。
t=x; 这句话根本不起作用.
t = new Integer(x);你更容易理解, t 的作用域只在方法体内,出了方法体就没用了.
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'));
}
}
Integer x=new Integer(34);
t=x;
}
你用这个方法 传进来
Integer x = 10;了
然后 t=10;
这是内存里面的做法
Integer x = 34
t=34
i的确是一个引用,不过传递的时候auto-unboxing把缓存里的值地址传过去了,是这么理解的么?
执行到这里时:
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
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也没有变化。
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的状态