Java 值传递引用传递之争
Posted blackblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 值传递引用传递之争相关的知识,希望对你有一定的参考价值。
Java 就是值传递
- 解决此问题之前也介绍形式参数和实际参数的区别
形式参数/实际参数
- 形式参数指用于接收函数被调用时候传入的实际参数
- 实际参数指调用有参函数时传入的实际内容
代码示例:
public static void main(String[] args) {
int a = 1;
setValue(a);// 此处的 a 看作实际参数
System.out.println(a);
}
/**
* 此处的 a 看做形式参数
* @param a
*/
public static void setValue(int a){
System.out.println(a);
}
求值策略
求值策略定义何时和以何时顺序求值给函数的实际参数,什么时候代换入函数和代换以何种方式进行
求值策略分为:
- 严格求值
- 非严格求值
严格求值
- 值传递
- 引用传递
- 共享对象传递
值传递
- 值传递就是实际参数再调用函数之前先被求值,其值被复制,复制后的值再传递给形式参数。因此形式参数再函数方法体内修改是不会影响原实际参数的值。
引用传递
- 引用传递传给函数是引用类型实际参数的隐士引用而非实参的拷贝。所以,在被调函数中改变形式参数的值,改变对于调用者来说是可见的
共享对象传递
- 传共享对象调用中,先获取实际参数的地址,然后将其复制,并将该地址的拷贝传给被调用函数的形式参数,所以共享传递对象也是值传递
实际也是将引用类型对应的JVM 堆中的地址传给函数
原始参数通过值传递给方法。这意味着对参数值的任何更改都只存在于方法的范围内。当方法返回时,参数将消失,对参数的任何更改都将丢失。
引用数据类型参数(如对象)也按值传递给方法。这意味着,当方法返回时,传入的引用仍然引用与以前相同的对象。但是,如果对象字段具有适当的访问级别,则可以在方法中更改这些字段的值
Java对象的传递,是通过复制的方式把引用关系传递了,如果我们没有改引用关系,而是找到引用的地址,把里面的内容改了,是会对调用方有影响的,因为大家指向的是同一个共享对象。
原文链接:
以上是关于Java 值传递引用传递之争的主要内容,如果未能解决你的问题,请参考以下文章