zoukankan      html  css  js  c++  java
  • **JAVA参数传递方式 (按值传递与引用传递区别)

    https://blog.csdn.net/q5706503/article/details/82910428
    public class TestMain {
    public static void main(String[] args) {
    BookVO bookVO1 = new BookVO();
    bookVO1.setName("bookVO1");

    // 传入参数到方法 其实就是传递给 swap2 的参数 xxx
    swap2(bookVO1);
    // 输出的结果是:bookVO1,
    log.info("swap2 = {}",bookVO1.getName());

    // 参数传递给 xxx 这里的代码和swap2方法里的代码一样
    BookVO xxx = bookVO1;
    {
    BookVO tmp = new BookVO();
    tmp.setName("test");
    xxx = tmp;
    }
    log.info("test = {}",bookVO1.getName());
    }

    public static void swap2(BookVO xxx){
    BookVO tmp = new BookVO();
    tmp.setName("swap2");
    xxx = tmp;
    }
    }

    首先要明确的是JAVA中没有引用传递, 全部是按值调用

    令大家所费解的 当对象引用作为参数时  函数为什么能修改真实的对象呢?这不是引用传递的特征吗?

    尤其先学习C++再学习JAVA的同学(比如说我自己)会这样认为,

    用白话解释就是:

    引用传递指针时, 连函数操作的指针都是原来的指针,比如C++传入对象时直接用传入的指针操作

    而JAVA的引用传进函数时 , 会复制一个引用与实参指向同一对象的引用, 操作的不是同一个引用,

    如果还不明白区别再换种方式解释一次:
    JAVA只有按值调用, 参数是什么都会复制一份再操作, 就算是对象的引用也会复制一份新的引用,只不过指向的是同一个对象

    这种传参方式叫做按值传递, 传递的东西可以是引用(类似C++的指针)

    如果是引用传递像C++传入指针不会再复制一份了,直接拿来用

    如果再不明白也没关系,看看下面的例子和解释分析
    举个例子:

    输出结果:


    也就说我们用一个函数修改了 传入的一个int变量和一个对象内容,

    再输出int变量和对象内容时发现 ,int的没有改变,而 对象的内容改变了

    这说明什么呢,说明像 int ,double等基本数据类型在参数传递时并没有传进变量本身,

    而是创建了一个新的相同数值的变量, 函数修改这个新变量并没有影响原来变量的数值,这也是按值传递的特点

    那为什么对象a的数据就改变了呢?

    因为虽然也是按值传递, 复制了一份新的引用但是指向的对象是同一个,修改后会影响原对象

    这种方式假如在函数内修改 a=null; 只是把复制的引用与对象的联系断开,不影响函数外与实际对象

    这就是按值传递, 即使传的是引用也不是引用传递,

    因为引用传递是不复制的,直接使用参数,如下图:

    这时候函数把指针a=null就指针就置空了,函数外也无法再通过指针访问对象了

    这样可以理解了吗,自我觉得足够明白了, 我如此深厚的画图功底都供出来了,再不明白就是在为难我胖虎!

    水平有限, 可能有错误,敬请指出! 

  • 相关阅读:
    LeetCode 368Largest Divisible Subset
    macbook 源码安装 redis6.2.6
    macbook 源码安装 nginx1.20.1
    MySQL总结
    DataWork之 MaxComputer的使用
    Spring的IOC源码分析
    Spring Bean的生命周期
    SpringMVC工作原理
    Spring全家桶(二)之SpringMVC总结
    (已经成功部署)配置vue+nginx+uwsgi luffy项目
  • 原文地址:https://www.cnblogs.com/cuiqq/p/11910138.html
Copyright © 2011-2022 走看看