2021-03-12

Java传参:值传递 or 引用传递 ?

刚开始学Java的时候一度以为:基本数据类型是值传递,引用类型是引用传递。新人很容易在这两个概念上面被搞糊涂,后来看了Hollis的文章才明白了Java中只有值传递。

接下来我能用简单明了的方式来说明这一问题,希望能对刚学习Java的朋友有点帮助。

 

1.概念

值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

值传递的概念没啥说的,修改复制文件不会影响到源文件,最容易产生歧义的就在这个引用传递上。理解上面两句话的关键在于两句话的前半段中是否有复制。

可以理解为有复制的就是值传递,无论复制的是值还是地址值。接下来我们依次探讨Java中传递基本类型和应用类型的过程。

 

2.传递基本数据类型

代码:

public static void main(String[] args) {  int i = 2;  add(i);  System.out.println("i = "+i); }public static void add(int x){  x += 1;  System.out.println("x = "+x); }  

 

 

通过代码和输出结果可以看出来,这就是值传递。

 

 i 把值复制一份给了 x ,再修改x的值无法影响 i 的值

 

3.传递引用类型

代码:

public static void main(String[] args) {  Person p1 = new Person("张三", 18);  change(p1);  System.out.println("p1地址:"+p1);  System.out.println("p1姓名:"+p1.getName());  System.out.println("p1年龄:"+p1.getAge()); }public static void change(Person p2){  p2.setAge(28);  System.out.println("p2地址:"+p2);  System.out.println("p2姓名:"+p2.getName());  System.out.println("p2年龄:"+p2.getAge()); }

结果:

 

 单从结果来看,可能就会有人误以为这是引用传递。

我们再来详细说说堆栈中是如何运作的:

 

 

我们再来看一个案例:

public static void main(String[] args) {  Person p1 = new Person("张三", 18);  change(p1);  System.out.println("p1地址:"+p1);  System.out.println("p1姓名:"+p1.getName());  System.out.println("p1年龄:"+p1.getAge()); }public static void change(Person p2){  p2 = new Person("李四",20);  System.out.println("p2地址:"+p2);  System.out.println("p2姓名:"+p2.getName());  System.out.println("p2年龄:"+p2.getAge()); }

结果:

 

 此时p1的值就没有受到change方法的影响

 

 由此可见,虽然对象中的数据可变,但是p1存的地址值是不会被change方法更改,即使传递引用对象,仍然是值传递。

 

如有错误欢迎指正!

 









原文转载:http://www.shaoqun.com/a/623650.html

跨境电商:https://www.ikjzd.com/

败欧洲网站:https://www.ikjzd.com/w/1555

anker:https://www.ikjzd.com/w/1027


刚开始学Java的时候一度以为:基本数据类型是值传递,引用类型是引用传递。新人很容易在这两个概念上面被搞糊涂,后来看了Hollis的文章才明白了Java中只有值传递。接下来我能用简单明了的方式来说明这一问题,希望能对刚学习Java的朋友有点帮助。1.概念值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递:在调用函数时将实际参
rakuten:https://www.ikjzd.com/w/2718
折扣网:https://www.ikjzd.com/w/74
isbn:https://www.ikjzd.com/w/174
Lazada注册开店流程以及相关问题解答:https://www.ikjzd.com/home/96055
亚马逊多合一研究工具Eresa(日本站):https://www.ikjzd.com/tl/107662
重磅!中国决定对原产于美国的汽车及零部件恢复加征关税!:https://www.ikjzd.com/home/105467

No comments:

Post a Comment