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

JAVA学习总结之值传参与引用传参

2016-08-19 21:41 204 查看
闲话不多说,先来思考下面这段代码的运行结果。

public class ParameterTransfer {

int a;

public static void main(String[] args) {

int b = 4;
System.out.println("b: " + b);
change(b);
System.out.println("change b: " + b);

ParameterTransfer parameterTransfer = new ParameterTransfer();
parameterTransfer.a = 10;
System.out.println("parameterTransfer.a: " + parameterTransfer.a);
change(parameterTransfer);
System.out.println("change parameterTransfer.a: " + parameterTransfer.a);
}

private static void change(int i) {
i = 100;
}

private static void change(ParameterTransfer parameterTransfer) {
parameterTransfer.a = 100;
}
}


这道题目一开始是传递基本数据类型,之后是传递引用类型,那么结果到底如何呢?

b: 4
change b: 4
parameterTransfer.a: 10
change parameterTransfer.a: 100


可以看得出来,基本数据类型传递之后改变,实际上并没有改变原先的值;但是如果是引用类型传值,那么将会改变原先的引用类型的值。

这是因为,实际上在java中,函数的传参都是通过栈来实现的。实际上都是传递栈中的值,将栈中的值复制拷贝一份给下一段函数代码。由于基本数据类型在内存结构中,存放的不是地址,而是真实的值,所以如果传递基本数据类型,那么也意味着将它的副本传递给下一段函数。由下一段函数运行,无论下一段函数怎么改变其值,都不会真正的改变原先的值。

引用类型在传参的时候,传递的也是值,但是并不是引用类型的这个对象,而是引用类型这个对象的地址。其实也就是相当于传递的是引用,众所周知两个引用同时指向同一个对象,其中一个引用改变这个对象的值,另一个引用的对象也会发生改变(因为他们实际上是一个对象)

这就合理的解释了为什么上述的程序的结果。

在java中,传值是通过栈来实现的,传递的是值,但是基本数据类型的值就是其本身的数据值,而引用类型的值确实它所指向的对象的地址,所以该传值相当于传递引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java