java 的值传递

    首先我们要知道在java是不同于c++的,它是没有指针的。

    形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。

    实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。

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

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

这里有一个形象的例子。

    你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。

    你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。

    也就是说如果是引用传递的,涉及的地址操作 实参会随着形参的操作而改变。结果则不然,java并没有这样做,而是实参给了形参一个地址指向,使它们在同时操作一个指向。最终的引用类型都会有指向,直到最后指向了八大基本数据类型,才会指向具体的值。

public class Test {

public String name;

public static void main(String[] args) {

// TODO Auto-generated method stub

        Test s1 = new Test();

        s1.name= "asd";

        change(s1);

        System.out.println(s1.name);

}

public static void change(Test a)

    {

        a.name="abc";

    }

}

      但是,不管上面哪种情况,你的朋友拿着你给他的钥匙,进到你的家里,把你家的电视砸了。那你说你会不会受到影响?而我们在change方法中,改变s1对象的name属性的值的时候,不就是在“砸电视”么。你改变的不是那把钥匙,而是钥匙打开的房子。所以对形参a的操作牵扯到了实参s1,故s1.name也就发生了改变,即为“abc”。

    如果我们在 change方法中加上一句 a= new Test();本来s1把自己的地址传给了a,他俩可以操作同一个对象内存时,a却又指向了新的指向,所以a的操作就与s1无关了,所以s1.name=“asd”。

    所以说,Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。

    对于java的这种值传递更好地解决了多个对象操作一个指针地址可能会造成的混乱问题。

你可能感兴趣的:(java 的值传递)