java传值与引用的关系

        首先,我们必须要搞清楚的一件事是,不管java的参数类型是什么,一律传递的是参数的副本。也就是说每次传递参数的时候都会讲参数拷贝一份传递。

1.基本数据类型:

        对于基本的数据类型来说,java传递的是指的副本;也就是将数据拷贝一份以后传递。因此当函数返回的时候,不管在调用的函数中做了什么操作,基本数据类型的值都不会改变。

2.对象型数据类型:

        对于对象型数据类型,java传递的则是参数的引用副本,也就是将对象的地址拷贝一份传递,因此,如果在调用的函数中改变了对象的值的话,那么函数返回以后,对象中的值也会跟着改变,如果在函数体重改变了对象的地址,那么函数返回以后由于地址不改变,因此对对象的地址的赋值操作其实也是没有用的。看下面的例子。

class Value{

        public int i  = 15;

}

public class Test{

        public static void main(String [] args){

                int i = 5;

                Value v = new Value();

                v.i = 25;

                second(v,i);

                System.out.println(v.i)

        }

        public void sencond(Value v,int i){

            i = 0;

            v.i = 20;

            Value value = new Value();

             v = value;

            System.out.printin(v.i+"    "+ i);

        }

}

输出结果为15,0,20.

解析:

        当调用second(v,i)函数的时候必须先将函数地址压入堆栈,函数的参数同时也会压堆栈,但是,对于基本数据类型的参数会将参数的实际值压入堆栈,而会将对象型参数的地址压如堆栈。当函数返回的时候,便会将参数从堆栈中取出来,由于对象型参数取出来的还地址,因此,不管在调用函数中做了什么修改地址操作,最后取出来的都是压如堆栈的参数的地址对应的值。同样,对于传值的参数,由于原参数的值直接压如堆栈了,那么函数返回的时候,取出来的还是原压入堆栈的值。这样的话就很好解释上面的程序的输出结果了。

点赞
收藏

评论区

加载中...

相关推荐

什么是函数柯里化?

原文链接:什么是函数柯里化?函数柯里化(HaskellBrooksCurry),当一个函数有多个参数的时候先传递一部分参数并且调用它(这部分参数后续不会进行改变),然后返回一个新的函数接收剩余的参数并返回结果。总结柯里化可以让我们给一个函数传递较少的参数得

vue中页面间跳转传值的两种方式(query,params)

两者都可以传递参数,区别是什么?query传参配置的是path,而params传参配置的是name,在params中配置path无效query在路由配置不需要设置参数,而params必须设置query传递的参数会显示在地址栏中params传参刷新会无效,但是query会保存传递过来的值,刷新不变;query:this.$route

Java中只存在值传递

在Java中并不存在引用传递(即地址传递),对于变量(可以是基本数据类型,也可以是引用数据类型)而言,可以理解为就是一个地址。传递,存在着拷贝操作。举个列子:1、在方法参数上,传递的是基本数据类型。定义了一个用于交换两个整型数的方法:publicstaticvoidswap(inta,intb){in

Java对象的浅拷贝和深拷贝&&String类型的赋值

Java中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、方法传参或返回值时,会有值传递和引用(地址)传递的差别。浅拷贝(ShallowCopy):①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,

Java里的按值传递与引用传递

按值传递还是按引用传递这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论:“在Java里面参数传递都是按值传递”。事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解,至于称作按什么传递就不是个大问题了。1:按值传递是什么指的是在方法调用时,传递的参

12、ES6形参默认值

当定义函数的时候,可以给参数设置默认值。调用的时候不传递参数值,就使用默认值。例子1:普通函数,不传递参数值。默认全是undefined。functionadd(a,b,c){console.log(a,b,c);}add();//不传递参数是,默认参数值全是undef