罗浩的技术专栏 Android and Python and C++ Coder

Java里的传引用和传值的区别是什么

2019-07-17


Java里的传引用和传值的区别是什么

基本概念

  • 传值
    传值就是指将一个值传递到方法的内部。例如int a = 5,那么也就是给int型变量a赋值,值为5.如果一个方法,将这个变量传进方法的内部,则进行的就是传值。在Java中,有8种基本数据类型,它们分别为:int、long、float、double、char、boolean、short、byte.这8种基本的数据类型作为参数进行传递是,都是进行的传值。·除此之外,还有一种特殊的情况,String。本身String是一个引用类型,很多人认为在向方法中传递String类型参数时,是进行传引用。其实在这里,String可以看做为一个包装类,因为String其本身就是通过字符数组实现的,那么它在实现参数传递的时候,也就是以char型数据的方式进行的,也就是进行传值。
  • 传引用
    java中的引用可以初步的理解为地址。也是在new了一个对象后,该对象是存在JVMHeap区,也就是堆。那么必然有一个地址要指向这个对象的在JVM中的位置,那么,指向这个对象的这个地址就可以简单的理解为“引用”。

实践

Java确实使用对象的引用来做计算的,所有的对象变量都是引用。但是,Java在向方法传递参数时传的不是引用,是值。
swap() 函数为例:

public void swap(int var1, int var2)
{
    int temp = var1;
    var1 = var2;
    var2 = temp;
}

swap方法返回时,被当作参数传入的变量仍然保持了原来的值不变。如果我们把传入的int型变量改为Object型也是一样的,因为Java通过传值来传递引用的。

原因分析

Java复制并传递了“引用”的值,而不是对象。因此,方法中对对象的计算是会起作用的,因为引用指向了原来的对象。但是因为方法中对象的引用是“副本”,所以对象交换就没起作用。交换动作只对方法中的引用副本起作用了,不影响方法外的引用。所以不好意思,方法被调用后,改变不了方法外的对象的引用。如果要对方法外的对象引用做交换,我们应该交换原始的引用,而不是它的副本。


上一篇 java静态变量

下一篇 Auto类型推导

Comments

Content