Java函数中传值与传引用的区别

1、对于基本数据类型,传递到函数中的是源变量的值

看下面例子:

public class Value_Index {
	public static void main(String[] args){
		int i = 100;
		method(i);
		System.out.println("method()中   i = "+method(i));
		System.out.println("i = " + i);
	}
	private static int method(int i) {
		i = i + 100;
		return i;
	}
}

上例结果为:

method()中   i = 200
i = 100

从例子中可以看出,虽然函数中返回的 i = 200,但是最初声明的 i 的值还是没变,等于100。所以对于基本类型只是把变量的值传递给函数,源变量的值不会因为函数里面的运算而改变。


2、对于对象类型,可以理解为传递到函数中的为对象的引用

看下面的例子:

public class Test2 {
	public static void main(String[] args){
		StringBuilder a = new StringBuilder("AAA");
		StringBuilder b = new StringBuilder("BBB");
		String c = new String("CCC");
		method(a, b);
		string_method(c);
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
	}
	private static void method(StringBuilder x, StringBuilder y) {
		x = x.append(y);
		x = y;
		y = x;
	}
	private static void string_method(String z) {
		z.replace('C', 'D');
	}
}


上例的运行结果为:

AAABBB
BBB
CCC

从中可以看出,a的值发生了变化,但是b和c的值却没有发生变化。看下图有助于理解其中的变化


这是因为往method方法中,传递了a和b的引用,所以最初x和y分别引用"AAA"和"BBB",经过x.append(y)方法,这里会在它引用的值上进行修改,所以此时原来的"AAA",变为了"AAABBB","BBB"的值并没有变。接下来 x = y,是将x指向y现在指向的地址,即"BBB",此时 y = x,即将y指向x所指向的地址,还是"BBB"。但是method方法里面的这些修改并没有影响到a和b所指向的地址,但由于a原先指向的"AAA"已经变为"AAABBB",所以打印出来a的值发生了变化,但是b所指向的"BBB"没有变化,所以打印的b的值没有改变。

最后看看String c,如果按上面的分析,c的值应该会发生改变,但是由于String是不能变化的,执行string_method方法中 replace()方法并不是在c所指向的"CCC",上做操作,而是又重新new了一个String对象"CCC",所以最终结果是c的值不会发生变化。

总结:

  1. 基本数据类型是传值到函数中,函数中的运算并不会改变源变量的值;
  2. 对象数据类型是传递的引用,如果函数中的操作是在源引用上修改对象值,则最终源变量会发生变化,如例2中的StringBuilder a,但是如果函数中的操作不是在源引用上修改对象值,则最终源对象不会发生改变,如例2中的String c;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值