#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\");


推荐阅读