2019年Java大厂面试题讲解(周阳) 之值传递和引用传递

举报
轻狂书生FS 发表于 2020/11/30 22:57:57 2020/11/30
【摘要】 TransferValue是什么? 值传递和引用传递changeValue1的执行过程changeValue2的执行过程changeValue3的执行过程 值传递和引用传递 /** * 值传递和引用传递 * @author: 轻狂书生 * @create: 2020-04-14-18:25 */ class Person { private ...

值传递和引用传递

/**
 * 值传递和引用传递
 * @author: 轻狂书生
 * @create: 2020-04-14-18:25
 */
class Person { private Integer id; private String personName; public Person(String personName) { this.personName = personName; }
}
public class TransferValueDemo { public void changeValue1(int age) { age = 30; } public void changeValue2(Person person) { person.setPersonName("XXXX"); } public void changeValue3(String str) { str = "XXX"; } public static void main(String[] args) { TransferValueDemo test = new TransferValueDemo(); // 定义基本数据类型 int age = 20; test.changeValue1(age); System.out.println("age ----" + age); // 实例化person类 Person person = new Person("abc"); test.changeValue2(person); System.out.println("personName-----" + person.getPersonName()); // String String str = "abc"; test.changeValue3(str); System.out.println("string-----" + str); }
}

  
 

最后输出结果

age ----20
personName-----XXXX
string-----abc

  
 

changeValue1的执行过程

八种基本数据类型,在栈里面分配内存,属于值传递

栈管运行,堆管存储

  
 

当们执行 changeValue1的时候,因为int是基本数据类型,所以传递的是int = 20这个值,相当于传递的是一个副本,main方法里面的age并没有改变,因此输出的结果 age还是20,属于值传递。

changeValue2的执行过程

因为Person是属于对象,传递的是内存地址,当执行changeValue2的时候,会改变内存中的Person的值,属于引用传递,两个指针都是指向同一个地址

changeValue3的执行过程

String不属于基本数据类型,但是为什么执行完成后,还是abc呢?

这是因为String的特殊性,当我们执行String str = "abc"的时候,它会把 abc 放入常量池中

当我们执行changeValue3的时候,会重新新建一个xxx,并没有销毁abc,然后指向xxx,然后最后我们输出的是main中的引用,还是指向的abc,因此最后输出结果还是abc。

文章来源: blog.csdn.net,作者:轻狂书生FS,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/LookForDream_/article/details/105950601

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。