欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

参数传递的三种情况

程序员文章站 2022-05-18 15:30:03
...

值传递

public static void f(int a) {
	a++;
	System.out.println(a);
}
public static void main(String[] args) {
	int t = 1;
	f(t);
	System.out.println(t);
}

  在上面的代码中,我们向方法f()传递了一个int参数t,在方法执行之后,t的值并没有改变。
  实际上在这个过程中,传递给f()方法的是t(t是实际参数)的值,在f()中会另外开辟一个内存空间来存储这个值(这个就是形式参数),此时内存中存在两个相等的基本数据类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
  小结:对于基本数据类型,传递的是值,在方法中进行的操作并不会影响到实际参数。

引用传递

public static void f(int[] a) {
	System.out.print("方法内的数组a: ");
	for (int i = 0; i < a.length; i++) {
		a[i]++;
		System.out.print(a[i] + " ");
	}
	System.out.println();
}

public static void main(String[] args) {
	int[] arr = new int[] { 1, 2, 3 };
	f(arr);
	System.out.print("方法调用结束的数组arr:");
	for (int x : arr) {
		System.out.print(x + " ");
	}
	System.out.println();
}
方法内的数组a: 2 3 4 
方法调用结束的数组arr:2 3 4 

  上面代码中,数组arr的值因为f()的关系改变了值。
  这是因为引用数据类型的变量名存储的不是值,而是存储值的地址。如int[] arr = {1,2,3},arr存储的不是{1,2,3},而是{1,2,3}的起始地址。
  所以在方法传递的时候,会传进去arr这个形式参数存储的地址,赋值给方法内的实际参数,此时这个实际参数和形式参数就指向同一块地址,再修改实际参数的值就相当于修改形式参数存储的值了。

几个特殊的引用数据类型

  String、Byte、Short、Integer、Long、Float、Double、Boolean、Character等final修饰的类虽然是引用数据类型,但是不会因为方法影响对象存储的数值。因为对于final修饰的类来说,对象一旦初始化,就不能修改值。这些对象修改数值,实际上就是创建新的对象。

Double d1 = 1.1;
Double d2 = d1;
System.out.println(d1==d2);
d1 = 1.2;
System.out.println(d1 == d2);
System.out.println(d2);
true
false
1.1

可以看到,修改d1的值,d1存储的地址已经改变了,就是因为修改d1的值的过程,实际上就是创建了一个内存空间,这个空间存储的值为1.2,然后将这个空间地址赋值给d1,而d1之前的地址中保存的值依旧没有改变。

小结

相关标签: JAVA