java参数传递?基本类型:引用类型

                              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没有真正意义上的引用传递。

只能通过间接的方式改变值。比如改变对象域的指向,或者改变对象数组的指向。

猜你喜欢

转载自blog.csdn.net/qq_43279637/article/details/84329819