您的位置:首页 > 编程语言 > Java开发

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

2017-01-17 01:50 633 查看

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

在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 = 2
After Swap -- a = 1       b = 2
Before Swap -- num1 = 1      num2 = 2
After Swap -- num1 = 2       num2 = 1


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

遗留问题

如果将基本数据类型改成基本数据类型对应的封装对象,为什么不能得到与情况二一样的结果?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java