Java参数传递过程中 传形参和传引用问题讨论

时间:2023-01-12 21:27:34

简述:

对于java中传递的参数, 分为两类,基本数据类型作为参数,如int,double等
以及 以某个对象类作为参数进行传递,在函数中修改参数的结果是不同的

1. 基本数据类型传递的是值

2. 引用数据类型传递的是地址

但是究竟哪些是基本类型呢?  下面做了比较粗犷的测试

以下测试的代码中,作为输入情况,分为五种:

先后传递五种不同的变量作为参数,观察是传形参,还是传引用

a)  一个自己定义的对象IntNum intNum, 修改其成员变量num

b)  普通的一个int num

c)  String 变量

d)  List 变量

e)  Array 变量

结果发现:

b, c, 都被视为基本数据类型,只是传递一个值,并没有新建一个对象,所以修改之后,值都没有变

剩余的传递过去的都是地址,都发生了改变 其中Array类型也发生了改变

测试代码:

package test.generic;

import java.util.ArrayList;

class IntNum{
	private int num;
	
	public IntNum(int num){
		this.num = num;
	}
	
	public void setNum(int num) {
		this.num = num;
	}
	
	public int getNum() {
		return num;
	}
}

class ParameterChanger{
	//here parameter is an IntNum class
	public void ChangeToZero(IntNum intNum){
		intNum.setNum(0);
	}
	
	//here parameter is basic data type int
	public void ChangeToZero(int num){
		num = 0;
	}
	
	public void ChangeStringToXXX(String str){
		str = "XXX";
	}
	
	public void ChangeListOnIndex0(ArrayList<Integer> array){
		array.set(0, 0);
	}
	
	public void ChangeArrayOnIndex0(int[] array){
		array[0] = 0;
	}
}

public class TestReferencePassingOrNot {
	public static void main(String[] args) {
		ParameterChanger parameterChanger = new ParameterChanger();
		
		IntNum intNum = new IntNum(100);
		System.out.println("Pass An Object Class as parameter: ");
		System.out.println("Number in IntNum Class before change: " + intNum.getNum());
		parameterChanger.ChangeToZero(intNum);
		System.out.println("Numberin IntNum Class after change: " + intNum.getNum());
		
		System.out.println("\nPass An Basic Data Type int as parameter: ");
		int num = 100;
		System.out.println("Number int before change: " + num);
		parameterChanger.ChangeToZero(num);
		System.out.println("Number int after change: " + num);
		
		System.out.println("\nPass String as parameter: ");
		String str = "TEST_STRING";
		System.out.println("String str before change: " + str);
		parameterChanger.ChangeStringToXXX(str);
		System.out.println("String str after change: " + str);
		
		System.out.println("\nPass List as parameter: ");
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(100);
		System.out.println("list.get(0) before change: " + list.get(0));
		parameterChanger.ChangeListOnIndex0(list);
		System.out.println("list.get(0) after change: " + list.get(0));
		
		System.out.println("\nPass Array as parameter: ");
		int array[] = new int[1];
		array[0] = 100;
		System.out.println("array[0] before change: " + array[0]);
		parameterChanger.ChangeArrayOnIndex0(array);
		System.out.println("array[0] after change: " + array[0]);
		
	}
}


输出:

Java参数传递过程中 传形参和传引用问题讨论