java中的值传递和引用传递

31 篇文章 4 订阅
21 篇文章 1 订阅

个人理解,可能会有错误之处,请仔细甄别,谨慎参考!如有错误或不同见解请指出!

值传递(Pass By Value或者Call By Value)是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。一般java中的基础类型数据传递都是值传递。
引用传递(Pass By Reference或者Call By Reference)一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。一般java中实例(包装)对象的传递是引用传递。

一、基本类型和引用类型在内存中的不同之处

int num = 10;
String str = "hello";


如图所示,num是基本类型,值就直接保存在变量中。而str是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容。

二、赋值时内存的变化

int num = 24;
String str = "world";

对于基本类型num,赋值运算符会直接改变变量的值,原来的值被覆盖掉。对于引用类型str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象(“hello” 字符串对象)不会被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)

三、调用方法时发生了什么,参数传递基本上就是赋值操作

第一个例子:基本类型

void change(int value) {
    value = 100;
}
change(num); // num 没有被改变

第二个例子:引用类型没有使用改变自身方法的方法

void change(String a) {
    a = "唐";
}
change(str); // str没有被改变

或:

StringBuilder stri = new StringBuilder("唐");
void change(StringBuilder builder) {
    builder = new StringBuilder("宋");
}
change(stri); // stri没有被改变,还是 "唐"。

 第三个例子:引用类型使用了改变自身方法的方法

StringBuilder stri = new StringBuilder("明");
void change(StringBuilder builder) {
    builder.append("清");
}
change(stri); // stri被改变了,变成了"清"。

第三个例子的图解:


builder.append("清")之后

参考:

java基本数据类型传递与引用传递区别详解_zejian的博客-CSDN博客_java值传递和引用传递java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题,首先我们必须认识到这个问题一般是相对函数而言的,也就是java中的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法(或函数)的两个专业术语:按值调用(call by value)按引用调用(call by reference)所谓的按值调用表示方法接收的是调用着提https://blog.csdn.net/javazejian/article/details/51192130

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肆〇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值