Java基础:Java中的参数传递      
View on GitHub

龙珠

修炼自己与发现世界

Java基础:Java中的参数传递

By arthur503 -- 15 Oct 2013

一般编程语言中方法的参数传递有两种:

1. 值传递; 2. 引用传递;

另外,方法参数类型有两种:

1. 基本数据类型; 2. 引用数据类型。

我们分别对不同的参数类型分析:

1. 对基本类型的传递是值传递

2. 对引用类型的传递也是值传递

但由于传递的是引用类型参数的地址,在方法中会有新的参数地址的拷贝,指向的也是同样的参数,因此有其特殊性。

在方法中,可以对参数地址所指向的地址所代表的数据进行修改,这个修改可以在返回后看到。但是,需要注意的是,在本质上对引用类型的传递还是值传递。因此,如果对两个参数的地址所指向的参数进行交换,则交换的结果是在方法中的参数的拷贝进行了交换,而不是原参数进行交换。这时的修改结果返回后是看不到的。

因此,Java中的参数传递均为值传递。

另外,问个小疑问:在方法中,交换参数后,修改所引用的参数,这个交换在原函数中看不到,但是修改是可以在原函数中看到的?我们可以写代码测试一下。

代码如下:

package test;

public class TestParameterPassing {

	public static void main(String[] argv){
		int a = 4;
		System.out.println("Init int a is:"+a);
		changeInt(a);
		System.out.println("After int a is:"+a);
		
		String s = "This is a String.";
		System.out.println("Init String s is:"+s);
		changeString(s);
		System.out.println("After String s is:"+s);
		
		Employee e1 = new Employee("E1");
		Employee e2 = new Employee("e2");
		e1.setSalary(100);
		e2.setSalary(200);
		System.out.println("Init E1 salary:"+e1.getSalary());
		System.out.println("Init E2 salary:"+e2.getSalary());
		changeEmployee(e1,e2);
		System.out.println("E1 salary:"+e1.getSalary());
		System.out.println("E2 salary:"+e2.getSalary());
	}

	private static void changeString(String s) {
		// TODO Auto-generated method stub
		s = "new string";
		return;
	}

	private static void changeInt(int a) {
		// TODO Auto-generated method stub
		a *= 10;
		return;
	}

	private static void changeEmployee(Employee e1, Employee e2) {
		// TODO Auto-generated method stub
//		e1.setSalary(e1.getSalary() * 10);
		e1 = e2;
		e1.setSalary(1000);
		System.out.println("change E1 salary to:"+e1.getSalary());
	}
	
	
}

class Employee{
	private String name;
	private int salary;
	public Employee(String name){
		this.name = name;
	}
	public void setSalary(int i){
		this.salary = i;
	}
	public String getName(){
		return name;
	}
	public int getSalary(){
		return salary;
	}
}

程序结果为:

Init int a is:4
After int a is:4
Init String s is:This is a String.
After String s is:This is a String.
Init E1 salary:100
Init E2 salary:200
change E1 salary to:1000
E1 salary:100
E2 salary:1000

可以看出,对int和String这样的基础类型的参数的修改是不返回的。对Employee这个引用类型的修改分两种:1. 对引用类型所指向的地址的修改是保存的,如:将e2赋给e1后,对e1(也就是e2)所指向的Employee修改salary为1000。在返回后,e1和e2指向的仍然是原来的e1和e2的地址,二者的变量引用地址不发生改变!但是由于e2所指向的Employee在方法中被修改salary为1000,所以,返回后,e2的salary为1000而非初始的200。

参考资料: