package mycode;
public class Test {
/* 在方法中形参地址改变不会影响到实参地址; */
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("Hello ");
System.out.println("Before change, sb1 = " + sb1);
System.out.println("Before changeData 实参内存地址:" + System.identityHashCode(sb1));
changeDataByNew(sb1);
System.out.println("After changeData 实参内存地址:" + System.identityHashCode(sb1));
System.out.println("After changeData , sb1 = " + sb1);
System.out.println("--------------------------------------------------------");
StringBuffer sb2 = new StringBuffer("Hello ");
System.out.println("Before change, sb2 = " + sb2);
System.out.println("Before changeData 实参内存地址:" + System.identityHashCode(sb2));
changeDataByAppend(sb2);
System.out.println("After changeData 实参内存地址:" + System.identityHashCode(sb2));
System.out.println("After changeData , sb2 = " + sb2);
System.out.println("--------------------------------------------------------");
String s="zs love jal";
changeString(s);
System.out.println(s);
System.out.println("--------------------------------------------------------");
int i=521;
changeInt(i);
System.out.println(i);
System.out.println("--------------------------------------------------------");
Integer integer=5211314;
changeInteger(i);
System.out.println(integer);
}
public static void changeDataByNew(StringBuffer strBuf) {
System.out.println("修改前的形参内存地址:" + System.identityHashCode(strBuf));
strBuf = new StringBuffer();
//new 改变了形参的地址,此时修改形参的值不会影响实参,因为形参和实参指向的地址不同。
System.out.println("修改后的形参内存地址:" + System.identityHashCode(strBuf));
strBuf.append("World!");
}
public static void changeDataByAppend(StringBuffer strBuf) {
/*引用类型的形参的引用地址与实参一样时,形参改变会影响到实参(除了String和基本类型)*/
System.out.println("修改前的形参内存地址:" + System.identityHashCode(strBuf));
System.out.println("修改后的形参内存地址:" + System.identityHashCode(strBuf));
strBuf.append("World!");
}
/*特殊情况String,以及Integer、Double等几个基本类型包装类,
它们都是immutable类型,
基本类型和String值改变是会改变对应的地址。
因为没有提供自身修改的函数,
每次操作都是新生成一个对象,
改变值后会指向新的地址,
所以要特殊对待,可以认为是和基本数据类型相似,传值操作。*/
public static void changeString(String s) {
System.out.println(s);
s="hahaha";
System.out.println(s);
}
public static void changeInt(int i) {
i=1000;
System.out.println(i);
}
public static void changeInteger(Integer i) {
i=2000;
System.out.println(i);
}
}