#Java#我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!( 二 )
- 传值调用(值传递)
- 在传值调用中 , 实际参数先被求值 , 然后其值通过复制 , 被传递给被调函数的形式参数 。 因为形式参数拿到的只是一个\"局部拷贝\" , 所以如果在被调函数中改变了形式参数的值 , 并不会改变实际参数的值 。
- 传引用调用(应用传递)
- 在传引用调用中 , 传递给函数的是它的实际参数的隐式引用而不是实参的拷贝 。 因为传递的是引用 , 所以 , 如果在被调函数中改变了形式参数的值 , 改变对于调用者来说是可见的 。
- 传共享对象调用(共享对象传递)
- 传共享对象调用中 , 先获取到实际参数的地址 , 然后将其复制 , 并把该地址的拷贝传递给被调函数的形式参数 。 因为参数的地址都指向同一个对象 , 所以我们称也之为\"传共享对象\" , 所以 , 如果在被调函数中改变了形式参数的值 , 调用者是可以看到这种变化的 。
但是 , 传共享对象调用和内传引用调用的结果又是一样的 , 都是在被调函数中如果改变参数的内容 , 那么这种改变也会对调用者有影响 。 你再品 , 你再细品 。
那么 , 共享对象传递和值传递以及引用传递之间到底有很么关系呢?
对于这个问题 , 我们应该关注过程 , 而不是结果 , 因为传共享对象调用的过程和传值调用的过程是一样的 , 而且都有一步关键的操作 , 那就是\"复制\" , 所以 , 通常我们认为传共享对象调用是传值调用的特例
我们先把传共享对象调用放在一边 , 我们再来回顾下传值调用和传引用调用的主要区别:
传值调用是指在调用函数时将实际参数`复制`一份传递到函数中 , 传引用调用是指在调用函数时将实际参数的引用`直接`传递到函数中 。
所以 , 两者的最主要区别就是是直接传递的 , 还是传递的是一个副本 。
这里我们来举一个形象的例子 。 再来深入理解一下传值调用和传引用调用:
你有一把钥匙 , 当你的朋友想要去你家的时候 , 如果你直接把你的钥匙给他了 , 这就是引用传递 。Java的求值策略前面我们介绍过了传值调用、传引用调用以及传值调用的特例传共享对象调用 , 那么 , Java中是采用的哪种求值策略呢?
这种情况下 , 如果他对这把钥匙做了什么事情 , 比如他在钥匙上刻下了自己名字 , 那么这把钥匙还给你的时候 , 你自己的钥匙上也会多出他刻的名字 。
你有一把钥匙 , 当你的朋友想要去你家的时候 , 你复刻了一把新钥匙给他 , 自己的还在自己手里 , 这就是值传递 。
这种情况下 , 他对这把钥匙做什么都不会影响你手里的这把钥匙 。
很多人说Java中的基本数据类型是值传递的 , 这个基本没有什么可以讨论的 , 普遍都是这样认为的 。
但是 , 有很多人却误认为Java中的对象传递是引用传递 。 之所以会有这个误区 , 主要是因为Java中的变量和对象之间是有引用关系的 。 Java语言中是通过对象的引用来操纵对象的 。 所以 , 很多人会认为对象的传递是引用的传递 。
而且很多人还可以举出以下的代码示例:
public static void main(String[
args) {
Test pt = new Test();
User hollis = new User();
hollis.setName(\"Hollis\");
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 「华为荣耀」华为彻底爆发,麒麟810++128G+屏下指纹,仅1399真香机
- #Java#java线程到底有多少种状态?
- 恐龙@历史上曾经生存着巨人,这个原因令他们彻底消失
- 『杨利伟』撒贝宁好奇一件宇航服多少钱,杨利伟5字回应,撒贝宁彻底懵了!
- 『5G』降价也不行,华为Mate30 Pro“黯然收场”,或彻底说再见!
- 高通:终于放弃因特尔基带! iPhone12全系标配高通基带: 彻底告别\信号门\
- iphone11:大降2600元,苹果彻底妥协了,网友:不买iPhone11了!
- 从小就很笨20 Pro彻底跌成“荣耀价”,不少网友后悔自己买太早!,华为Mate
- #跑分#联发科天玑1000+跑分首度曝光,53W分麒麟990 5G彻底垫底
- 飞哥传说历史又一科技巨头宣布自研系统!安卓系统彻底被抛弃,华为又慢了一步
