JAVA函数可以修改传入的变量吗?

泛泛的谈,可以说,有时可以有时不可以. 那我们就具体些,直入主题,看疗效吧.下面是一个例子:

 

import java.util.LinkedList;
import java.util.List;

public class Api {
	public static final void main(String[] args) {
		int tmp = 10;
		change(tmp);
		//可以看到,传入的temp没有被修改掉
		System.out.println(tmp);

		List<Integer> list = new LinkedList<Integer>();
		change(list);
		//可以看出,传入的List被修改了,之前大小是0,现在打印结果是1
		System.out.println("size=" + list.size());
	}

	public static void change(int tmp) {
		tmp = tmp * 2;
	}

	public static void change(final List<Integer> list) {
		list.add(1);
	}

}

 

 

 

实际上,上面这个问题和这个问题是一个问题"JAVA函数传递的是值,还是引用"

JAVA传递的是值,只不过这个值的Value是变量的引用.

 

change(int tmp)之所以没有修改传入的值,是因为Integer是不可变对象,不能直接修改Integer的值,只能生成一个新的对象然后指向它.这样函数里面的临时变量和传入的变量值(引用)已经不一样了

 

 

change(final List<Integer> list) 里面的值之所以被修改了,是因为参数出入的值是引用,引用没有变,但是引用的对象变了.由于引用的对象变了,所有指向这个对象的变量当然也就变了.

 

 

细心的你可能已经发现,change(int tmp)这个参数不能添加final.

如果添加就是代表tmp不能修改为别的对象,而change(final List<Integer> list)却可以. 原因也是一样的:

change(int tmp):在函数的内容中,我们会对tmp进行修改,导致tmp指向不同对象,如果声明为final则修改处会出现语法错误.

 

change(final List<Integer> list):虽然final修饰后不能修改为别的对象,但是对象里面的内容是可以修改的.

 

 

 

 

你可能感兴趣的:(java)