java方法参数的赋值问题实例源码介绍。方法里面的所有变量,都是临时存在内存空间的,出了这个方法就不认识了。
传进去的参数,虽然实参是某个对象(的引用),而真正到了参数中,会变成与实参相同内存地址的一个引用。
换句话说,方法里面的参数,与实参(传入参数)仅仅是两个内存地址相同的引用!
方法前三个参数,分别是类的三个变量,方法第四个参数,实际上就是第一个参数。
当刚刚传入的时候,第一个参数==第二个参数==类变量
当执行完赋值后,第一个参数!=(第二个参数==类变量)
而数组字符串和字符,通过输出字符串数组的内存地址看,永远不变,所以说==可以成立。
问题出在,为什么给第一个参数赋值后,它就变了内存地址?
这是因为原先它的值为”abc”,当给它值值为”dbc”后,会在常量池中创建一个”dbc”对象,然后指向它。
就在这儿,第一个参数的内存地址就变了。由此可见,把”abc”改成”dbc”并非像我们想象的,只需把第一个字母改一下这么简单,
只要稍有变化,就会在常量池中再创建一个新对象,原对象不变,如果没有引用指向它,可能会被回收!
而第四个参数,由于给它赋值为”abc”,常量池中已经存在,所以不会新创建对象,所以始终指向它。
而数组,new一个才会在堆里面创建一个,所以,改变它的元素,不会影响到内存地址的改变。不管怎么改,始终是它。
有这么一个例子:
package wzq.j2se.claz;
public class FunMember {
String a = “abc”;
String[] b = {“a”,”b”,”c”};
char[] c = { ’1 ‘, ’2 ‘, ’3 ‘};
public static void main(String[] args) {
FunMember fm = new FunMember();
fm.change(fm.a, fm.b,fm.c,fm.a);
System.out.println(“————-main——–”);
System.out.println(fm.a);
System.out.println(fm.b);
System.out.println(fm.c);
System.out.println(fm.b[0]);
System.out.println(“————-main——–”);
}
public void change(String aa,String[] bb,char[] cc,String temp){
System.out.println(“————-change前——–”);
System.out.println(a==aa);
System.out.println(temp==aa);
System.out.println(temp==a);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(“————-change前——–”);
aa = “dbc”;
temp = “abc”;
bb[0] = “d”;
cc[0] = ’5 ‘;
System.out.println(“————-change后——–”);
System.out.println(a==aa);
System.out.println(temp==aa);
System.out.println(temp==a);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(“————-change后——–”);
}
}
输出:
————-change前——–
true
true
true
abc
[Ljava.lang.String;@de6ced
123
————-change前——–
————-change后——–
false
false
true
abc
[Ljava.lang.String;@de6ced
523
————-change后——–
————-main——–
abc
[Ljava.lang.String;@de6ced
523
d