Java值传递与引用传递

    技术2022-05-20  39

    java中没有了c++中 & 这样的引用符号,也没像c#中那样提供了out与ref 那么它是怎么做的呢?

    在java中实质只存在一种传递方式:即值传递。 而引用传递是对C/C++而言的。结论:

      对于基本类型,在方法体内对方法参数进行重新赋值,并不会改变原有变量的值。

      对于引用类型,在方法体内对方法参数进行重新赋予引用,并不会改变原有变量所持有的引用。

      方法体内对参数进行运算,不影响原有变量的值。

      方法体内对参数所指向对象的属性进行运算,将改变原有变量所指向对象的属性值。

      在JAVA中变量有以下两种:

      基本类型变量,包括char、byte、short、int、long、float、double、boolean。

      引用类型变量,包括类、接口、数组(基本类型数组和对象数组)。

      最后我们得出如下的结论:

      基本类型和基本类型变量被当作参数传递给方法时,是值传递。在方法实体中,无法给原变量重新赋值,也无法改变它的值。

      对象和引用型变量被当作参数传递给方法时,在方法实体中,无法给原变量重新赋值,但是可以改变它所指向对象的属性。

    做什么事情都要去除例外的东西,String类就是此类问题的一个特殊情况

    为什么特殊呢?

    因为它是一个引用类型,确执行的是值传递。这样说有些抽象,还是举个例子吧

    值传递:

    class Str {public static void main(String[] args) { int i = 900;System.out.println(i);

    changeInt(i);System.out.println(i);}

    public static void changeInt(int s){s = 34234;}}

    结果:900900

    这就是所谓的值传递。i把自己的副本给了函数changeInt的形参,而在changeInt中虽然将s赋值34234.但是对原来的i值并没有影响,因为它所修改的只是i的copy品而已。

    引用传递:

    class Str {public static void main(String[] args) { Yinyong y = new Yinyong();System.out.println(y.age);

    changeObject(y);System.out.println(y.age);}

    public static void changeObject(Yinyong obj){obj.age = 34234;}}

    class Yinyong{int age = 22;}

    声明了个简单的类Yinyong,当把Yinyong的对象y传递给函数changeObject后,看下前后结果:

    2234234

    值被改变了,这就是引用调用。

     

    下面再看看传递String对象会发生什么结果?

    class Str {public static void main(String[] args) { String s = "java test";System.out.println(s);

    changeString(s);System.out.println(s);}

    public static void changeString(String str){str = "3gg over right";}}

    看看结果吧:

    java testjava test

    你惊奇的发现s的值并没有改变!你会问了,String不也是引用类型的吗?怎么它的值没有改变呢?

    因为是这样的:

    String被设计为不可修改的类型,也就是对String对象的任何修改都将重新创建一个对象而放弃以前的内存空间的引用!

    如上例:

    比如 s指向0x2344, 当它赋值给str时str也同样指向了0x2344.而当 执行str="3gg over right"后,str指向了别的地方。也许是

    0x2222或者其他,反正不是0x2344了。所以当你输出s的时候,它的值并没有被修改!


    最新回复(0)