引用传递也是值传递

其实之前就懂这个东西,但今天突然就想写下来记录一下。

1.首先说 aa作为对象的引用传入swap函数,则对aa的内部操作确实可以影响到外部a的引用指向的值。

但b传入的引用bb也可以操作b的值,但bb指向了aa,这样一来,bb就跟b指向的不是同一个东西了,所以b的值不会改变。

public class TestObject {
    public int val = 5;
    public void increase(){
        val++;
    }
    public static void main(String[] args) {
        TestObject a =new TestObject();
        TestObject b =new TestObject();
        swap(a, b);
        System.out.println(a.val+" "+b.val);
    }
    public static void swap(TestObject aa, TestObject bb){
        aa.increase();
        bb = aa;
    };
}

输出: 6 5

2.当b为数组时,传入的bb虽然也是b的另一个副本(都指向了数组的首地址),但bb[0] 却跟 b[0] 是同一个东西(都是数组首地址的那个值,虽然这个值存的是其他TestObject对象的引用地址),bb[0]引用的改变也就改变了b[0]的引用(事实上他们就是一个东西)。

public class TestObject {
    public int val = 5;
    public void increase(){
        val++;
    }
    public static void main(String[] args) {
        TestObject a =new TestObject();
        TestObject[] b =new TestObject [1];
        b[0] = new TestObject();
        swap(a, b);
        System.out.println(a.val+" "+b[0].val);
    }
    public static void swap(TestObject aa, TestObject [] bb){
        aa.increase();
        bb[0] = aa;
    };
}

输出: 6 6

时间: 2024-11-25 01:48:44

引用传递也是值传递的相关文章

Java中,函数参数的传递,是值传递还是引用传递

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递. 可以这么理解:有一个Person(name="S"),作为参数传给一个方法,在此方法中将此Person重新设置name=“B”,那么有一下结论 ①这个Person还是这个Person,一直都是他,但是他的名字被改了,不管是原来的引用还是方法里的引用,引用的都是一个对象,所以,所有引用的值都变了 ②如果在方法中重新new了一个Person赋给参数,

參数传递(引用,指针,值传递)C++11

C++中,函数的參数传递方式有值传递.地址传递.传地址有指针和引用方式. 在函数參数中,传地址的理由有: 1.使被调函数能够改动主调函数中的数据对象: 2.传地址能够降低数据拷贝,提高程序运行速度. 那么,何时使用值传递,何时使用地址传递(指针和引用)? 以下是一些写代码时会遇到的一些情况 被调函数使用參数对象时,不会改动数据对象 假设要传入函数的数据对象较小,比方是内建数据类型或小规模的结构体,那么使用值传递: 假设数据对象是数组,那么使用指针(这也是你唯一的选择).指针加入const修饰:

参数传递(引用,指针,值传递)C++11

C++中,函数的参数传递方式有值传递.地址传递.传地址有指针和引用方式. 在函数参数中,传地址的理由有: 1.使被调函数可以修改主调函数中的数据对象: 2.传地址可以减少数据拷贝,提高程序执行速度. 那么,何时使用值传递,何时使用地址传递(指针和引用)? 下面是一些写代码时会遇到的一些情况 被调函数使用参数对象时,不会修改数据对象 如果要传入函数的数据对象较小,比如是内建数据类型或小规模的结构体,那么使用值传递: 如果数据对象是数组,那么使用指针(这也是你唯一的选择).指针添加const修饰:

Java中的值传递和引用传递

解释 1.Java中有没有引用传递? 答:Java中只有按值传递,没有按引用传递! 2.当一个对象被当作参数传递到一个方法中后,在此方法中可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递. Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言).如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的,如果在函数中改变了副本

c# 值类型与引用类型 值传递与引用传递

值类型与引用类型: 值类型 :1.值类型大小固定.存储在栈上.  2.不能继承,只能实现接口 3.派生自valuetype int double char float byte bool enum struct decimal 引用类型:1.在栈上存储了一个地址实际存储在堆中,大小不固定. 2.数组.类.接口.委托 string 数组 类 接口 委托 值传递与引用传递: 值类型按值传递.值类型按引用传递.引用类型按值传递.引用类型按引用传递. 值传递:默认传递都是值传递 ,把栈中内容拷贝一份引用

java中值传递和引用传递

本来今天刚学习的内容,然后去其他博客看了下,发现都吵起来了,就是名字原因,有的说java有值传递和引用传递,有的说引用传递本质就是值传递,我管你杂说的,只要自己理解好,代码知道运行结果就好了. 我用自己的话,自己的理解来解释下,反正都是自己写着玩,自己看的 值传递:传递的值,这个值以后怎么改变,源值不会发生改变的. 引用传递:将对象的引用地址传递过去,如果值发生改变,那么源值也发生改变. 代码如下: 值传递: public class Test1 { public static void mai

C#中的引用传递、值传递

  先来说下C#中的数据类型.分值类型和引用类型两大类. 值类型:直接存储数据的值,保存在内存中的stack(堆栈)中 引用类型:存储对值的引用,实际上存储的就是一个内存的地址.引用类型的保存分成两块,实际值保存在托管堆(heap)中.实际值的内存地址保存在stack中 当使用引用类型时先找到stack中的地址,再找到heap中的实际值. 也就是说保存引用类型时要用到stack和heap,但使用引用类型时我们实际上只用到stack中的值,然后通过这个值间接的访问heap中的值 C#预定义的简单类

JavaScript进阶(三) 值传递和引用传递

从C语言开始 有时候讲一些细节或是底层的东西,我喜欢用C语言来讲,因为用C更方便来描述内存里面的东西.先举一个例子,swap函数,相信有一些编程经验的人都见识过,声明如下,函数体我就不写了,各位脑补一下. void swap1(int a, int b); void swap2(int* a, int* b) 这里swap1是不能交换两个数的值的,swap2可以.那为什么呢?有教材会说,第一个是值传递,第二个是引用传递,传递的是指针,所以第二个可以.好吧,这个解释和没说一样,那下面我就来解释一下

C#中的引用传递和值传递。

最近在写项目中有同事碰到这样的传值问题,可能很多对这个参数的传递还有点疑惑,自己也是对这个基础知识做一个回顾和巩固. 首先什么是值类型和引用类型可以去园里看一下相关的资料,都有介绍. 常用值类型包括:int ,long ,bool,decimal,char,float 等 常用的引用类型包括:string,arry,delegate, interface,class 等 一.传递值类型参数 向方法传递值类型变量意味着向方法传递变量的一个副本.方法内发生的对参数的更改对该变量中存储的原始数据无任何