java参数传递?基本类型:引用类型
java通过参数传递不能改变对应基本类型的值,通过参数传递改变对象的域的值。那么程序运行在内存中是怎样做的呢?
先来看看代码实现上述验证。
package Test;
public class Test {
public int a;
public static void main(String[] args) {
// TODO Auto-generated method stub
Test s1=new Test();
s1.a=100;
Test s2=new Test();
s2.a=70;
change(s1);
System.out.println(s1.a);
int n=123;
change2(n);
System.out.println(n);
String t1="lyc";
change3(t1);
System.out.println(t1);
}
public static void change(Test s) {
s.a=10;
}
public static void change2(int s) {
s=300;
}
public static void change3(String s) {
s="ljm";
}
}
可以看到基本类型int类型和string类型通过传递参数没有变化,而对象变化了。
原因是这样的:
int类型和String类型的变量是在栈中,int的值在栈中。String的值在方法区的常量池中。
把变量传到方法中之后会有一个新的变量指向自己的值,所以不会改变原变量的值
而对象通过调用方法的时候,方法中的域指向常量池的数据被改变,所以会改变元对象中的域的值。
注意点:
1:一旦对象生成之后他的物理地址以及域指向的地址是不变的。
2:对于string来说,尽管通过参数传递之后。方法里的string指向了另一个地方。但是原来的string还
指向原来的地方所以不会改变。
3:两个对象通过函数变化之后也是一样的道理。怎样变化之后原来的两个对象还是指向原来的位置。
所以原来对象的域不会变。
4:通过对象数组传递对象参数可以互换域的值。达到交换对象的效果。其实这是因为对象数组中的每个元素
指向每个对象,通过互换数组元素之后就会指向不同的对象。就可以达到互换对象的效果。
总结:直接通过方法改变string类型int类型的值是不会改变原来的值的,因为java没有真正意义上的引用传递。
只能通过间接的方式改变值。比如改变对象域的指向,或者改变对象数组的指向。