精华内容
下载资源
问答
  • 值传递与引用传递的区别
    2021-11-04 15:25:14

    (1)在Java里面,当调用方法时,如果传入的数值为基本数据类型(包含String类型),形式参数的改变对实际参数不影响,就是值传递。

    (2)在Java里面,当调用方法时,如果传入的数值为引用数据类型(String类型除外),形式参数的改变对实际参数有影响,就是引用传递。

    更多相关内容
  • 主要介绍了JAVA参数传递方式,结合实例形式分析了java按值传递与引用传递区别及相关操作注意事项,需要的朋友可以参考下
  • 另一方面,值传递由于形参和实参内存地址不一样,有些功能并不能实现(swap()),因此,除了极为简单的函数会使用值传递外,大多数会采用引用传递。而对于指针传递,则在涉及数组的情况下使用较多,因为指针本身会给...
  • 首先讨论函数之前,先弄清楚基本类型值与引用类型的复制问题 一、数据类型的复制分析 内存分为栈区(stack)和堆区(heap) ,如果将内存看成一本书,栈好比是书的目录,而堆就是书的内容,基本类型可以看成内容...
  • 如果函数收到的是一个可变对象(比如字典 或者列表)的引用,就能修改对象的原始——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能 直接修改原始对象...
  • 主要介绍了Python中 传递 传递引用区别解析,非常不错,具有参考借鉴价值,需要的朋友参考下吧
  • 主要介绍了详解java的值传递、地址传递、引用传递的相关资料,需要的朋友可以参考下
  • 本篇文章主要是对C#中的引用传递与值传递进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
  • Java值传递与引用传递区别

    千次阅读 多人点赞 2021-09-09 22:55:57
    文章目录Java值传递与引用传递前景实参形参值传递与引用传递Java中的值传递总结 前景 关于这个问题,引发过很多广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的。还有的人可能...

    Java值传递与引用传递

    前景

    关于这个问题,引发过很多广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的。还有的人可能知道Java中的参数传递是值传递,但是说不出来为什么。
    在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了。如果你有以下想法,那么你有必要好好阅读本文。

    • 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。
    • 错误理解二: Java是引用传递。
    • 错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。

    实参与形参

    我们都知道,在Java中定义方法的时候是可以定义参数的。比如Java中的main方法, public static void main(String[ ] args),这里面的args就是参数。参数在程序语言中分为形式参数和实际参数。
    形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
    实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。
    简单举个例子:

    public static void main( String[ ] args) {
    ParamTest pt = new ParamTest();
    pt.sout( "Hollis");//实际参数为Hollis
    }
    public void sout( String name) {/!形式参数为name
    system.out.println(name);
    }
    
    

    实际参数是调用有参方法的时候真正传递的内容,而形式参数是用于接收实参内容的参数。

    值传递与引用传递

    上面提到了,当我们调用一个有参函数的时候,会把实际参数传递给形式参数。但是,在程序语言中,这个传递过程中传递的两种情况,即值传递和引用传递。我们来看下程序语言中是如何定义和区分值传递和引用传递的。

    值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
    引用传递是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

    有了上面的概念,然后大家就可以写代码实践了,来看看Java中到底是值传递还是引用传递,于是,最简单的一段代码出来了:

    public static void main( String[] args) {
         ParamTest pt = new ParamTest();
        int i = 10;
        pt.pass(i);
        System.out.println( "print in main , i is " +i);
    }
    public void pass(int j){
        j = 20;
        system.out.println( "print in pass , j is " + j);
    }
    
    

    上面的代码中,我们在pass方法中修改了参数j的值,然后分别在pass方法和main方法中打印参数的值。输出结果如下:

    print in pass , j is 20
    print in main , i is 10
    

    可见,pass方法内部对i的值的修改并没有改变实际参数i的值。那么,按照上面的定义,有人得到结论: Java的方法传递是值传递。
    但是,很快就有人提出质疑了(哈哈,所以,不要轻易下结论咯。)。然后,他们会搬出以下代码:

    public static void main(String[ ] args) {
        ParamTest pt = new ParamTest();
        User hollis = new User();
        hollis.setName( "Hollis");
        hollis.setGender("Male");
        pt.pass(hollis);
        system.out.println( "print in main , user is " + hollis);
    }
    public void pass(User user) {
        user.setName( "hollischuang");
        System.out.println( "print in pass , user is " + user);
    }
    

    同样是一个pass方法,同样是在pass方法内修改参数的值。输出结果如下:

    print in pass , user is User{name='hollischuang', gender='Male '}
    print in main , user is User{name='hollischuang' , gender='Male '}
    

    经过pass方法执行后,实参的值竟然被改变了,那按照上面的引用传递的定义,实际参数的值被改变了,这不就是引用传递了么。于是,根据上面的两段代码,有人得出一个新的结论:Java的方法中,在传递普通类型的时候是值传递,在传递对象类型的时候是引用传递。
    但是,这种表述仍然是错误的。不信你看下面这个参数类型为对象的参数传递:

    public static void main( string[] args) {
        ParamTest pt = new ParamTest();
        string name = "Hollis";
        pt.pass(name ) ;
        System.out.println( "print in main , name is " + name);
    }
    public void pass(string name) {
        name = "hollischuang";
        system.out.println( "print in pass , name is " + name);
    }
    
    
    

    上面的代码输出结果为

    print in pass , name is hollischuangprint in main , name is Hollis
    

    这又作何解释呢?同样传递了一个对象,但是原始参数的值并没有被修改,难道传递对象又变成值传递了?

    Java中的值传递

    上面,我们举了三个例子,表现的结果却不一样,这也是导致很多初学者,甚至很多高级程序员对于Java的传递类型有困惑的原因。其实,我想告诉大家的是,上面的概念没有错,只是代码的例子有问题。来,我再来给大家画—下概念中的重点,然后再举几个真正恰当的例子。

    值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
    引用传递是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

    那么,我来给大家总结一下,值传递和引用传递之前的区别的重点是什么。

    值传递引用传递
    根本区别会创建副本 copy不创建副本
    所有函数中无法改变原始对象函数中可以改变原始对象

    我们上面看过的几个pass的例子中,都只关注了实际参数内容是否有改变。如传递的是User对象,我们试着改变他的name属性的值,然后检查是否有改变。其实,在实验方法上就错了,当然得到的结论也就有问题了。
    为什么说实验方法错了呢?这里我们来举一个形象的例子。再来深入理解一下值传递和引用传递,然后你就知道为啥错了。
    你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。
    你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。
    但是,不管上面那种情况,你的朋友拿着你给他的钥匙,进到你的家里,把你家的电视砸了。那你说你会不会受到影响?而我们在pass方法中,改变user对象的name属性的值的时候,不就是在“砸电视”么。
    还拿上面的一个例子来举例,我们真正的改变参数,看看会发生什么?

    public static void main(String[ ] args){
        ParamTest pt = new ParamTest();
        User hollis = new User();
        hollis.setName( "Hollis");
        hollis.setGender("Male" );
        pt.pass(hollis);
        system.out.println("print in main , user is " + hollis);
        public void pass(User user) {
            user = new User();
            user.setName( "hollischuang");
            user.setGender( "Male");
            system.out.println( "print in pass , user is " + user);
    
    

    上面的代码中,我们在pass方法中,改变了user对象,输出结果如下:

    print in pass , user is User{name='hollischuang ' , gender='Male '}
    print in main , user is User{name='Hollis', gender= 'Male '}
    

    我们来画一张图,看一下整个过程中发生了什么,然后我再告诉你,为啥Java中只有值传递。

    稍微解释下这张图,当我们在main中创建一个User对象的时候,在堆中开辟一块内存,其中保存了name和gender等数据。然后hollis持有该内存的地址ex123456(图1)。当尝试调用pass方法,并且hollis作为实际参数传递给形式参数user的时候,会把这个地址ex123456交给user,这时,user也指向了这个地址(图2)。然后在pass方法内对参数进行修改的时候,即user = newUser();,会重新开辟一块 eX456789的内存,赋值给user。后面对user的任何修改都不会改变内存eX123456的内容(图3)。
    上面这种传递是什么传递?肯定不是引用传递,如果是引用传递的话,在user=new User()的时候,实际参数的引用也应该改为指向eX456789,但是实际上并没有。
    通过概念我们也能知道,这里是把实际参数的引用的地址复制了一份,传递给了形式参数。所以,上面的参数其实是值传递,把实参对象引用的地址当做值传递给了形式参数。
    我们再来回顾下之前的那个“砸电视”的例子,看那个例子中的传递过程发生了什么。

    同样的,在参数传递的过程中,实际参数的地址eX1213456被拷贝给了形参,只是,在这个方法中,并没有对形参本身进行修改,而是修改的形参持有的地址中存储的内容。
    所以,值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参。在判断实参内容有没有受影响的时候,要看传的的是什么,如果你传递的是个地址,那么就看这个地址的变化会不会有影响,而不是看地址指向的对象的变化。就像钥匙和房子的关系。
    那么,既然这样,为啥上面同样是传递对象,传递的String对象和User对象的表现结果不一样呢?我们在pass方法中使用name = “hollischuang”;试着去更改name的值,阴差阳错的直接改变了name的引用的地址。因为这段代码,会new一个String,在把引用交给name,即等价于name =new String(“hollischuang”);。而原来的那个”Hollis”字符串还是由实参持有着的,所以,并没有修改到实际参数的值。

    所以说,Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。

    总结

    无论是值传递还是引用传递,其实都是一种求值策略(Evaluation strategy)。在求值策略中,还有一种叫做按共享传递。其实Java中的参数传递严格意义上说应该是按共享传递。

    按共享传递,是指在调用函数时,传递给函数的是实参的地址的拷贝(如果实参在栈中,则直接拷贝该值)。在函数内部对参数进行操作时,需要先拷贝的地址寻找到具体的值,再进行操作。如果该值在栈中,那么因为是直接拷贝的值,所以函数内部对参数进行操作不会对外部变量产生影响。如果原来拷贝的是原值在堆中的地址,那么需要先根据该地址找到堆中对应的位置,再进行操作。因为传递的是地址的拷贝所以函数内对值的操作对外部变量是可见的。

    简单点说,Java中的传递,是值传递,而这个值,实际上是对象的引用。
    而按共享传递其实只是按值传递的一个特例罢了。所以我们可以说Java的传递是按共享传递,或者说Java中的传递是值传递。

    所以函数内部对参数进行操作不会对外部变量产生影响。如果原来拷贝的是原值在堆中的地址,那么需要先根据该地址找到堆中对应的位置,再进行操作。因为传递的是地址的拷贝所以函数内对值的操作对外部变量是可见的。

    简单点说,Java中的传递,是值传递,而这个值,实际上是对象的引用。
    而按共享传递其实只是按值传递的一个特例罢了。所以我们可以说Java的传递是按共享传递,或者说Java中的传递是值传递。

    //本文借鉴于知乎Holis先生

    展开全文
  • java 中没有引用传递,都是值传递的,可以通过传递副本修改对象的,副本交换,并不影响原引用
  • 值传递与引用传递详解

    万次阅读 多人点赞 2020-10-29 23:11:11
    1、关于值传递与引用传递的定义 值传递:是指在调用函数时,将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,就不会影响到实际参数 如下图所示,当传递参数之前会将参数进行复制,函数中修改了...

    1、关于值传递

    值传递:是指在调用函数时,将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,就不会影响到实际参数

    如下图所示,当传递参数之前会将参数进行复制,函数中修改了参数,不会影响实际参数
    在这里插入图片描述
    值传递是对于是对基本数据而言,例如下面例子,number没有改变。

    public class Test01 {
        public static void main(String[] args) {
            int number = 10;
            new Test01().change(number);
            System.out.println(number);
        }
    
        public void change(int a){
            a+=1;
        }
    }
    

    在这里插入图片描述

    2、关于引用传递

    引用传递:是指在调用函数时,将实际参数的地址传递到函数中,那么在函数中对参数进行修改,将会影响到实际参数

    引用数据类型分为两个部分,引用变量和对象,这两个部分放在不同的地方,引用变量在栈中,而对象是放在堆内存中的,引用变量指向对象。
    如下图所示,当传递参数之前会将参数进行复制,但是复制的是引用变量,复制后的引用变量还是指向内存中的同一对象,所以引用传递中,函数修改了参数会影响实际参数
    在这里插入图片描述
    引用传递是对于引用数据类型而言,例如对于User类姓名的修改,会改变对象的name。

    public class Test01 {
        public static void main(String[] args) {
            User user = new User("小明", 12);
            new Test01().change(user);
            System.out.println(user);
        }
    
        public void change(User a){
            a.setName("小张");
        }
    }
    

    在这里插入图片描述


    注意点,引用类型中的String的值是放在常量池中,我们改变副本的值不会影响到原来的值。
    在这里插入图片描述

    例如在change放发中改变了副本的值,但是原来的str字符串不会改变。

    public class Test01 {
        public static void main(String[] args) {
            String str = "hello";
            new Test01().change(str);
            System.out.println(str);
        }
    
        public void change(String a){
            a="yes";
        }
    }
    

    在这里插入图片描述

    展开全文
  • 当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递引用传递。  值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值  引用传递的特点:方法内部对传...
  • JAVA参数传递方式 (按值传递与引用传递区别)

    万次阅读 多人点赞 2018-09-30 22:58:30
    首先要明确的是JAVA中没有引用传递, 全部是按调用 令大家所费解的 当对象引用作为参数时 函数为什么能修改真实的对象呢?这不是引用传递的特征吗? 尤其先学习C++再学习JAVA的同学(比如说我自己)会这样认为, 用...

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

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

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

    用白话解释就是:

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

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

    如果还不明白区别再换种方式解释一次:

    JAVA只有按值调用, 参数是什么都会复制一份再操作, 就算是对象的引用也会复制一份新的引用,只不过指向的是同一个对象

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

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

     

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

    举个例子:

    输出结果:

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

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

     

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

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

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

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

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

     

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

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

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

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

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

    展开全文
  • 值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。  按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数...
  • 在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是值传递引用传递都具备。那么JS的参数传递到底是怎么回事呢?事实上以下的演示也完全可以用于Java 首先来一个比较简单的,...
  • #值传递引用传递 python中数据类型有:整形,字条串,元组,列表,字典,集合 不可变数据类型:当该数据类型对应变量的值变化,值对应的内存地址 也发生变化,这个值就为不可变数据类型 可变数据类型:当该数据...
  • Go语言之值传递与引用传递

    千次阅读 2022-02-15 17:31:20
    Go语言中函数的参数有两种传递方式:按值传递和按引用传递。 Go默认使用按值传递来传递参数,也就是传递参数的副本。在函数中对副本的值进行更改操作时,不会影响到原来的变量。 按引用传递其实也可以称作”按...
  • C#值传递与引用传递区别

    千次阅读 2022-05-29 15:00:02
    C#值传递与引用传递区别 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具关键技术:ntl 作者:王子锐 撰写时间:2022/5/28 (全部用字体大小10) 首先...
  • 一、值传递:是指在调用函数时将s实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 ​ 代码在内存中的执行流程: 1、首先加载main方法; ​ 2、接下来int number = 100...
  • Java:按值传递还是按引用传递详细解说
  • 主要介绍了java到底是值传递还是引用传递的相关知识,本文通过几个例子给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 主要介绍了Java中值传递和引用传递区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了JS引用传递与值传递区别与用法,结合实例形式较为详细的对比分析了javascript引用传递与值传递的原理、区别、使用方法及相关操作注意事项,需要的朋友可以参考下
  • 主要介绍了java通过实例了解值传递引用传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了 Java 值传递引用传递详解及实例代码的相关资料,需要的朋友可以参考下
  • 值传递还是引用传递
  • 关于Java中形参实参的理解今天阅读了一个写的非常棒的博文,通过此博文再次复习了Java中参数传递的知识(即值传递与引用传递区别)。参考网站http://www.cnblogs.com/binyue/p/3862276.html。下面我将通过次博文...
  • Java中没有引用传递值传递:就是在方法调用的时候,实参是将自己的一份拷贝赋给形参,在方法内,对该参数值的修改不影响原来的实参。引用传递:是在方法调用的时候,实参将自己的地址传递给形参,此时方法内对该参数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 718,317
精华内容 287,326
热门标签
关键字:

值传递与引用传递的区别