值传递和引用传递的区别

先说变量

Java中有基础变量(8种基本数据类型的)和引用变量(除了8种基本数据类型之外的, 一般指的是对象类型的变量, 也称引用)。

注意:String也是对象类型的一种,但它作为一种比较常用的数据类型, 较于纯粹的对象类型还有不同之处。

再说字面值

字面值指的是某个类型的合法取值, 或者说,可以为该类型的变量赋值的数据。

例如, “int a = 5;”,  a就是变量, 5就是字面值。

eg1:

  Int a = 10;

  int b = a; // a的字面值赋值/传递给b

  // 此时输出a、b字面值皆是10

  b  = 20; // b的字面值赋值为20

  // 此时输出b字面值为20,a字面值仍旧是10

总结:

【值传递不影响传递的另一方数据(a)】

然后是引用中存的不是数值那是啥?

对于基本变量而言,其中存储的是值,而引用(可以看作指针)中存放的是?

对于对象类型来说,在计算机中, 对象本质上是一块内存区域(内存块),每一块儿内存块儿,都会有它的首地址,引用就是指向了这个首地址.(可以稍稍看下计算机原理)

所以,引用中保存的就是对象在内存中的首地址。

有一点要明确,引用中所保存的对象的首地址,有别于真正的对象,我们可以通过引用来操作一个对象。

最后说一下什么是多个引用指向同一个对象

class MyValue{

  int value;

}

public class TestMyValue{

  public static void main(String args[]){

    MyValue mv1 = new MyValue();// 此时value属性默认值为0

    mv1.value = 100;// 此时设置value属性值为100

    MyValue mv2 = mv1;// 将mv1的值传给mv2,由于mv1中存储的是对象的首地址,故mv2也指向了相同的对象首地址

    mv2.value = 200;// 改变对象的value属性值为200

    System.out.println(mv1.value);// 结果是100 ,原因是mv1引用和mv2引用指向了同一块内存数据(对象),mv1引用和mv2引用都有修改的权利, 先然数据被mv2引用修改为200。

  }

}

总结:

【引用传递有可能会改变另一方,应该说是一起变化的(mv1和mv2)】

原文地址:https://www.cnblogs.com/zhuyeshen/p/12511885.html