下面有两个例子:
1. 先定义一个类型Value
Java代码 publicstaticclassValue{ privateStringvalue="value"; publicStringgetValue(){returnvalue;} publicvoidsetValue(Stringvalue){this.value=value;} }
2. 写两个函数newValue和modifyValue:newValue会将入参指向一个新的对象,modifyValue会调用入参的setValue方法修改对象的value值。
Java代码 publicstaticvoidnewValue(Valuevalue){ value=newValue(); value.setValue("newvalue"); System.out.println("InnewValue,HashCode="+value.hashCode()+",value="+value.getValue()); } publicstaticvoidmodifyValue(Valuevalue){ value.setValue("newvalue"); System.out.println("InmodifyValue,HashCode="+value.hashCode()+",value="+value.getValue()); }
3. 简单的测试代码
Java代码 publicstaticvoidmain(String[]args){ Valuevalue1=newValue(); System.out.println("Beforemodify,HashCode="+value1.hashCode()+",value="+value1.getValue()); //将value1指向新的Value对象 newValue(value1); System.out.println("Aftermodify,HashCode="+value1.hashCode()+",value="+value1.getValue()+"\n"); Valuevalue2=newValue(); System.out.println("Beforemodify,HashCode="+value2.hashCode()+",value="+value2.getValue()); //使用object的set方法,修改对象的内部值 modifyValue(value2); System.out.println("Aftermodify,HashCode="+value2.hashCode()+",value="+value2.getValue()); }
4. 执行结果日志:
Java代码
Beforemodify,HashCode=12677476,value=value InnewValue,HashCode=33263331,value=newvalue Aftermodify,HashCode=12677476,value=value Beforemodify,HashCode=6413875,value=value InmodifyValue,HashCode=6413875,value=newvalue Aftermodify,HashCode=6413875,value=newvalue
示例2:
示例3:
public class Test3 { public static void change(int []a){ a[0]=50; } public static void main(String[] args) { int []a={10,20}; System.out.println(a[0]); change(a); System.out.println(a[0]); } }
显然输出结果为10 50。实际传递的是引用的地址值。
内存分析:
示例4:
class Emp { public int age; } public class Test { public static void change(Emp emp) { emp.age = 50; emp = new Emp();//再创建一个对象 emp.age=100; } public static void main(String[] args) { Emp emp = new Emp(); emp.age = 100; System.out.println(emp.age); change(emp); System.out.println(emp.age); System.out.println(emp.age); } }
输出为:100 50 50.
内存分析:
对于String类:
public class Test { public static void change(String s){ s="zhangsan"; } public static void main(String[] args) { String s=new String("lisi"); System.out.println(s); change(s); System.out.println(s); } }
输出为:lisi lisi,由于String类是final修饰的,不可变,它会在内存中在开辟一块新空间。