java中只有值传递,没有引用传递

看到很多网站上(包括一些知名的培训网站)都说java有引用传递,其实这是不正确的,java中只有值传递,没有引用传递。我来分析一下吧,值传递很容易理解,举个简单的例子:

public static void main(String[] args) {
		
	int a = 2;
	calculate(a);
	System.out.println(a);
	
}

public static void calculate(int param) {
	param = 3;
}
输出结果是2,a的值根本就没有改变,因为把a值传递给函数calculate传递的只是 对所传递参数a进行一次副本拷贝param,对参数a的修改只是对副本param的修改,函数调用结束,副本丢弃,原来的变量a不变 ( 即实参不变 )。

那为什么很多网站上会说有引用传递呢?他们给出了很强的例证:

class Ref1{
	int temp = 10;
	
}

public class RefDemo01 {
	public static void main(String args[]){
		Ref1 r1 =new Ref1();
		r1.temp = 20;
		System.out.println(r1.temp);
		tell(r1);
		System.out.println(r1.temp);
	}
	public static void tell(Ref1 r2){
		r2.temp = 30;
	}

}
输出的结果是20,30,难道这就是引用传递吗,因为值改变了嘛!其实不是这样子的,这里只是把r1的指向改变了而已,本来r1指向堆中的值是20,现在只是将r1在堆中指向了内容为30的堆,而r1本身是没有变化的,不信?来看下这个例子吧:

class Ref1{
	int temp = 10;
	
}

public class RefDemo01 {
	public static void main(String args[]){
		Ref1 r1 =new Ref1();
		Ref1 r2 =new Ref2();
		r1.temp = 20;
		r2.temp = 30;
		System.out.println(r1.temp);
		System.out.println(r2.temp);
		tell(r1,r2);
		System.out.println(r1.temp);
		System.out.println(r2.temp);
	}
	public static void tell(Ref1 r1,Ref1 r2){
		Ref1 temp;
		temp = r1;
		r1 = r2;
		r2 = temp;
	}

}
输出的结果是20,30;20,30,和上面的例子差不错,唯一不同的是函数功能修改成了将r2赋值给r1,但是可以看出r1的值根本就没有发生改变,原因很简单,参数传递属于值传递,而不是引用传递。java中根本就没有引用传递!



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值