java中关于“按值传递”的相关问题

来源:互联网 发布:puppy linux xiazai 编辑:程序博客网 时间:2024/06/05 02:11

关于“按值传递”相关问题

在java的世界中,只有“按值传递”,不存在“按引用传递”。(这不同于c/c++,c/c++存在按值传递和按引用传递两种方式)

按值传递

按值传递意味着当将一个参数传递给一个方法时,方法接收的原始值的一个副本。

按引用传递

按引用传递意味着当将一个参数传递给一个方法时,方法接收到原始值的内存地址,而不是值的副本。

个人看法

其实,“内存地址”也是一个“值”,而这个“值”被叫作“引用”。
按值传递还是按引用传递的区别在于“是否在传递的时候进行对象的内存拷贝”,java中的基本数据类型在jvm中存储的区域不同于普通对象,所以传递前会拷贝,传递的是拷贝后的值;而对象在传递时不拷贝,直接传“地址”(引用),指向同一片对象堆内存区域。

所以,就存在两种情况。

1、 两值交换,初始值不变(基本数据类型)

2、 两对象值交换,值改变(对象)

 public static void swap ( int a, int b ) {                int temp;                temp = a;                a = b;                b = temp;        }

因为两个参数都是基本数据类型,所以传递前会进行拷贝,所以交换的是“副本”,而非原始数据,不会对原始数据造成影响。

public static void swap(Swap swap){                int temp;                temp = swap.num1;                swap.num1 = swap.num2;                swap.num2 = temp;        }

参数为对象,对象传递时不会进行拷贝,传递的是地址的“引用值”(指向同一片地址区域),当两个成员变量所在指向的地址发生交换时,成员变量对应的值也会发生改变,所以交换后会对对象中的成员变量的值造成影响。

//测试代码//public static void main ( String[] args ) {        int a = 1, b = 2;        System.out.println ( "Before Swap -- a = " + a  + "     b = " + b );        swap ( a, b );        System.out.println ( "After Swap -- a = " + a + "       b = " + b );        int num1 = 1,num2 = 2;        Swap s = new Swap ( num1,num2 );        System.out.println ( "Before Swap -- num1 = " + s.num1 + "      num2 = " + s.num2);        swap ( s );        System.out.println ( "After Swap -- num1 = " + s.num1 + "       num2 = " + s.num2 );}

输出结果:

Before Swap -- a = 1     b = 2After Swap -- a = 1       b = 2Before Swap -- num1 = 1      num2 = 2After Swap -- num1 = 2       num2 = 1

输出结果与分析的结果一样

遗留问题

如果将基本数据类型改成基本数据类型对应的封装对象,为什么不能得到与情况二一样的结果?

0 0