值传递和引用传递的区别
先说变量
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)】