2019-12-10

                 java到底是值传递还是引用传递

   我相信对于这个问题,不同的人肯定会有不同的看法,但大概总结下来应该就以下几个观点:

   1.java是引用传递的,所有传递过来的参数都可以更改;

   2.java中参数如果是基本数据类型就是值传递,如果是对象就是引用传递;

   3.如果之前接触过C或C++应该会毫不犹豫的认为只有值传递;

  首先,我们需要明确什么是值传递和引用传递:

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

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

根据以上概念,我们马上可以反驳第一种观点:


很明显,我们调用changeNum()方法不起作用,这足以证明第一种看法是错误的;

再看下面一个例子:


可能大部分人包括我在内都认为第二种看法是没错的,我们的例子也完美佐证了第二种观点;但是下面一个例子也许会打破大部分人的固有观点:


很奇怪是吗?为什么上面的例子仅仅改变了一行代码,结果竟然会大大不同。其实,我们只需画个示意图就明白了


       图一我们可以明显发现堆中指向的地址都是一样的,因此我们改变的是同一对象;但图二就不同了,当我们new Person()时在堆中会开辟新的空间,其在堆中的地址也会改变,这样的话就和引用传递的定义相违背了,因为其传过来的实参地址已经指向Ox5678对象了,即Jury对象,但实际上输出的仍然是Perter对象。所以我们就可以明白上面的参数其实是值传递,实际上是把实参引用的地址当做值传递给了形参。

     最后我们可以做个总结,java中实际是按值传递的,对于基本数据类型,直接在栈中拷贝一份,改变其值对原数据不受影响;对于引用对象来说,其实传递的是地址一个副本,本质上还是属于值传递。

原创不易, 如需转载,请注明出处!

——纯生啤酒_

你可能感兴趣的:(2019-12-10)