zoukankan      html  css  js  c++  java
  • 一篇文章了解Java参数传递,再也不用纠结到底是值传递还是引用传递

    Java参数到底是值传递还是引用传递呢?

    先来公布一下答案把

    对于基本类型参数来说:是copy值进行传递

    对于对象来说:是引用传递

    修改了基本类型的参数,原值不变

    修改了对象内部的值,则原对象的也会改变

    若修改了对象的地址,则原对象不变

    一个方法明白这一切

        @Test
        public void test2(){
            Integer i = 0;
            int j = 129;
            List<Integer> list = new ArrayList<>();
            List<Integer> list2 = new ArrayList<>();
    
            System.out.println("实参i = " + i);
            System.out.println("实参j = " + j);
            System.out.println("实参list = " + list);
            System.out.println("实参list2 = " + list2);
    
            test3(i++, j, list, list2);
    
            System.out.println("传值调用后i = " + i);
            System.out.println("传值调用后j = " + j);
            System.out.println("传值调用后list = " + list);
            System.out.println("传值调用后list2 = " + list2);
    
        }

    其中 test3 的代码如下:

        private void test3(Integer i,int j, List<Integer> list, List<Integer> list2){
            System.out.println("test3方法入参i = " + i);
            System.out.println("test3方法入参j = " + j);
            System.out.println("test3方法入参list = " + list);
            System.out.println("test3方法入参list2 = " + list2);
    
            i = 130;
            j = 10;
            list.add(110);
            list2 = list;
    
            System.out.println("test3给i赋值后 = " + i);
            System.out.println("test3给j赋值后 = " + j);
            System.out.println("test3改变list对象中的值后 = " + list);
            System.out.println("test3给list2重新赋值,也就是改变地址后 = " + list2);
        }

    运行结果:

    实参i = 0
    实参j = 129
    实参list = []
    实参list2 = []
    test3方法入参i = 0
    test3方法入参j = 129
    test3方法入参list = []
    test3方法入参list2 = []
    test3给i赋值后 = 130
    test3给j赋值后 = 10
    test3改变list对象中的值后 = [110]
    test3给list2重新赋值,也就是改变地址后 = [110]
    传值调用后i = 1
    传值调用后j = 129
    传值调用后list = [110]
    传值调用后list2 = []

    是不是很明显了呀~~~

    这里面有一个特例,就是就是包装类型的传递

    比如上述代码中的 Integer 类型的传递

    为什么与我最一开始说的不一样呢?Integer应该是属于对象,但为什么改变它的参数的值后,原参数并没有变呢?

    是这样子的

    我们可以看一下 Integer 的源码

    可以在我哒断点的这两个地方打断点看一下

    由于value值是final类型的,final类型的值是不可以修改的

    每次给它赋值都相当于是新new了一个对象,将对象的地址赋值给这个参数

    所以,就和我们最开始说的 若修改了对象的地址,则原对象不变  是一样的~~~

  • 相关阅读:
    x86 hook跳转内存地址转换计算框架
    win10180317134配合VS2017搭建WDK驱动开发环境
    C/C++字节特征码转换自动格式化文本工具算法源码
    jar包直接拷贝到WEBINF/lib下和以userLibrary引入的区别
    java.io.IOException: Cannot rename original file to %TOMCAT_HOME%\conf\tomcatusers.xml.old
    Tomcat5 和 Tomcat6 类加载器架构
    Tomcat version * only supports J2EE * Web modules
    tomcat启动时报错:org.apache.catalina.core.AprLifecycleListener init
    tomcat 不能正常启动,双击 startup.bat 一闪而过
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  • 原文地址:https://www.cnblogs.com/zhangqian27/p/11793209.html
Copyright © 2011-2022 走看看