你真的了解引用传递与值传递吗?
文章目录
- 1.方法参数的两种类型
- 2.方法参数的规则
- 3.代码验证
- 3.1一个方法不能修改一个基本数据类型的参数
- 3.2一个方法可以改变一个对象参数的状态
- 3.3一个方法不能让对象引用一个新的对象
- 4.一个案例进一步理解方法调用
本文已同步到:https://www.bithachi.cn/posts/255ba281.html
1.方法参数的两种类型
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
严格点说其实只有一种:值传递。 即将实际参数(基本数据类型或引用数据类型)值的副本传入方法内,而参数本身不受影响。
2.方法参数的规则
- 一个方法不能修改一个基本数据类型的参数(byte,short,int,long,float,double,char,boolean)
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象引用一个新的对象
3.代码验证
3.1一个方法不能修改一个基本数据类型的参数

说明:
调用tripleValue这个方法之 后,percent 的值还是 10。
下面看一下具体的执行 过程:
- 1 ) x 被初始化为 percent 值的一个拷贝(也就 是 10 )
- 2 ) x 被乘以 3后等于 30。 但是 percent 仍然 是 10
- 3 ) 这个方法结束之后,参数变量 X 不再使用。
3.2一个方法可以改变一个对象参数的状态

说明:
具体的执行过程为:
- 1 ) X 被初始化为 harry 值的拷贝,这里是一个对象的引用。
- 2 ) raiseSalary 方法应用于这个对象引用。x 和 harry 同时引用的那个 Employee 对象的薪金提高了 200%。
- 3 ) 方法结束后,参数变量 x 不再使用。
- 当然,对象变量 harry 继续引用那个薪金增至 3 倍的雇员对象
3.3一个方法不能让对象引用一个新的对象

说明:
- 方法并没有改变存储在变量 a 和 b 中的对象引用。
- swap 方法的参数 x 和 y 被初始 化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。
- 在方法结束时局部变量变量 X 和 y 从栈区出栈,被丢弃了。原来的变量 a 和 b 仍然引用 这个方法调用之前所引用的对象
这个过程说明:Java 程序设计语言对对象采用的不是引用调用,实际上, 对象引用是按值传递的。
对象引用按值传递,即方法传递的是这两个对象引用的值,可以理解为地址,就像基本数据类型一样,我们不能改变着两个引用值/地址,但是我们却可以改变这两个引用值指向的对应对象的状态值
4.一个案例进一步理解方法调用
public class Test {public void second(Value v, int i) {i = 0;v.i = 20;Value val = new Value();v = val;System.out.println(v.i + " " + i);}public void first() {int i = 5;Value v = new Value();v.i = 25;second(v, i);System.out.println(v.i);}public static void main(String[] args) {Test test = new Test();test.first();}class Value {int i = 15;}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!



