java传引用面试_面试官:Java是值传递还是引用传递呢?我是这样回答的

本文详细介绍了Java中的参数传递机制,澄清了“值传递”与“引用传递”的理解误区,指出Java实际上是共享对象传递。通过实例解释了值传递、引用传递以及共享对象传递的区别,帮助读者理解方法调用中参数如何影响实际对象。
摘要由CSDN通过智能技术生成

一、概述

曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:“传参数就是值传递,传对象就是引用传递”,后面进一步查找了相关资料和文章以后,发现这么理解是不正确的。

这里先放结论:

java中参数的传递可以理解为 都是值传递

基础数据类型传递的是 值的****拷贝

对象类型是共享对象传递,传递的是 地址的拷贝

二、形参和实参

要理解参数的传递就必须先理解形参和实参:

形参:就是形式参数,用于 定义方法的时候使用的参数 ,是用来接收调用者传递的参数的。形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元。因此, 形参只在方法内部有效 ,所以针对引用对象的改动也无法影响到方法外。

实参:就是实际参数,用于调用时 传递给方法的参数 。

举个例子:

public static void main( String[] args ) {

String string = "Hello";

//string是实际参数

sout(string);

}

public static void sout(String str){

//str为形式参数

System.out.println(str);

}

三、值传递和引用传递与共享对象传递

1.值传递和引用传递

理解了实参和形参,以及java对应的数据类型,我们就可以理解值传递和引用传递了。

值传递:方法调用时,实际参数的 值 被传递给对应的形式参数,函数接收的是原始值的一个copy, 此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作 都是对形参这个值的修改,不影响实际参数的值 。

引用传递/址传递:方法调用时,实际参数的 地址 被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址。在方法执行中, 形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象 。

对于这两种方式,网上有一个非常形象的图:

f1cfac33e3cd

image

2.共享对象传递

但是java的传值策略有点类似于两者的结合,是 共享对象传递 :

共享对象传递:先获取到实际参数的地址,然后将其复制,并把 该地址的拷贝 传递给被调函数的形式参数。因为参数的地址都指向同一个对象,所以我们称也之为"传共享对象",所以,如果在被调函数中改变了形式参数的值,调用者是可以看到这种变化的。

这也是之所以说java也是值传递的原因,共享对象传递实际上也是对实参进行拷贝然后赋给形参,但是操作针对的对象不是值而是地址!

由于传递的是地址的拷贝,所以如果你在方法中将这个地址指向了新的对象,实际上是没有任何对方法外是没有任何作用的,举个例子:

public static void main( String[] args ) {

Person p = new Person();

System.out.println("main中:" + p.hashCode());

change(p);

System.out.println("main中:" + p.hashCode());

}

public static void change(Person person){

person = new Person();

System.out.println("change中:" + person.hashCode());

}

//输出

main中:692404036

change中:1554874502

main中:692404036

可以看到在 main 方法中输出的hashCode指向的都是同一个对象,而 change 中指向了另一个,可以这么理解:

p为指向了第一个Person对象的地址

把p拷贝了一份得到p‘,这里的p’就是 change 方法中的形参p

change 中p指向了一个新的Person对象,在 change 这个函数范围里p指向的就是new出来的第二个Person对象的地址

由于 change 中的p实际上是 main 中p的拷贝p‘,所以在 change 里p'指向的改变对 main 中的p不会有任何影响

四、总结

你在福建有座仓库,给自己配了一把钥匙

1.三种传递:

值传递:你建了一座一模一样的仓库给别人

引用传递:把你家仓库的钥匙给了别人

共享对象传递:把你家仓库钥匙复刻了一把给别人

2.共享对象传递的特点:

拷贝的地址与原地址指向同一个内存对象:别人用你复刻的钥匙一样能进出你的仓库

拷贝地址引用对象的改变不影响原地址的引用对象:别人在山东也盖了个仓库,用你给他的钥匙配了锁,他的钥匙在山东只能开他的仓库,你的钥匙在福建只能开你的仓库

欢迎关注微信公众号【慕容千语】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值