对于JAVA中只有值传递的疑惑答疑

很多朋友都听过你的老师说JAVA只有值传递,但是根本没有理解为啥只有值传递,基本数据类型还可以理解,但是引用类型的时候就产生了疑惑,为什么我将某某对象传递给方法,但是他的值改变了,这不就违背了JAVA只有值传递的说法了么。

首先我们来理解值传递和引用传递。

简单来说:值传递,传递的是对象的复制的值,是对象的副本,方法内部无论怎么改变不会影响到方法外的对象本身。

引用传递:传递的是对象的地址,方法中对对象的改变会导致方法外的对象发生变化。

这里很多人有个理解误区,值传递很好理解,也很好证明,值传递是对对象的值说的,而引用传递是对对象的地址说的。你用值的改变来证明是引用传递这是不对的。

记住一点:是否存在引用传递的关键,就是是否能通过方法来改变实参对象的地址。

在这里我要解释下, 传递一个对象给了方法,在对象中对对象的属性做了修改,然后方法外的对象的属性也跟着做了改变

首先引用对象引用的是对象的地址。

我对声明对象做一个拆开解释

String str=new String("123");

以上代码做了2个关键步骤

1.声明引用

2.将对象的地址指向引用对象

所以拆解后的代码就是

String str;

str=new String("123");

引用对象,引用的是对象的地址。你传递参数给方法的时候,传递的是引用的拷贝。这个和基本数据类型有区别,基本数据类型拷贝的是他的值,而这里拷贝的是引用。正是因为拷贝的是引用所以在方法中2个引用指向了同一个地址,给你的错觉是传递的地址。而在方法中改变了方法中对象的引用地址的时候,方法外的引用地址不会跟随改变。这就是值传递。

 

下面开始贴代码,每一行我都贴了注释。

/***
 * 值传递:传递的是对象的拷贝,方法内部无论怎么修改不会导致参数的本身发生变化
 * 
 * 引用传递:传递的是地址,方法内部改变地址后,会导致原参数的地址跟随改变
 * 
 * 理解盲区:很多人会因为看到引用对象的数值改变了以为是引用传递。
 * 
 * 谨记一点,区分值传递还是引用传递的关键是地址是否发生改变
 * 
 * 因此通过地址的变化来证明JAVA中不存在引用传递来帮助理解,Java中只存在值传递。
 */
public class Test {

	public static String getTest(String param) {
		param = new String("345"); // 改变引用对象的地址 如果是引用传递会改变原参数的地址,值传递会创建新的地址
		return param;
	}

	public static void main(String[] args) {
		String param1 = "123";// 引用对象,原地址上的对象
		String result = getTest(param1);// 获得新地址返回后的对象
		System.out.println("原对象的地址上的数值为" + param1 + "\n新地址上的数值为" + result);
		// 通过实验证明传递的并不是对象的地址,因为对引用的地址改变之后并没有导致原参数的地址跟随一起改变
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值