分析Java值传递与引用传递
背景
今天在公司做需求的时候,突然遇到了这个问题,八股文背过,但是又记不大清楚了。索性写下来,方便我这笨蛋脑子下次看。
解释
理解这个问题在于看它的角度(强调、加粗)
那我们开始,Java中一切都是值传递(中心句),基本变量传递的实际的值,比如 int a=3 会将 3 传递进去;引用变量传递的是地址,比如 User user=new User() 会将 user 所在的地址传递进去。
从 角度 来分析
所谓值传递,基本变量本身的 值 就是这里的值, 引用变量的 地址 就是这里的值。
String 及包装类型也是值传递,因为这些对象不可变(Immutability)具体可参考:https://stackoverflow.com/questions/1552301/immutability-of-strings-in-java
从 可见性 来分析
基本变量:
先需要了解,局部变量会放在栈中,成员变量会放在堆中,如下图所示:

一个方法对应一个栈帧,方法结束后栈帧便会弹出
在上图中,test 方法栈帧感知不到 change 方法的变化,所以当 change 方法栈帧弹出后,test 方法依旧会输出 3 。
引申一下:现在一个公司需求 A系统、B系统 要同时操作一个数据,并要求实时感知数据变化,那我们可以怎么做?最简单的办法,加一个中间件,例如redis。需要注意数据一致性。
引用变量:
如果是修改引用变量,那么便会修改堆中的数据,多个栈帧对应一个堆中对象,无论哪个方法修改了数据,其他方法再次访问都会感知变化。

分析Java值传递与引用传递的更多相关文章
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结
这个话题一直是Java程序员的一个热议话题,争论不断,但是不论是你百度搜也好还是去看官方的文档中所标明的也好,得到的都只有一个结论:Java只有值传递. 在这里就不贴代码细致解释了,让我们来看看一些论 ...
- 理解java值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变 ...
- Java是值传递还是引用传递?
Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...
- 一道笔试题来理顺Java中的值传递和引用传递
题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...
- Java中的值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型 ...
- 堆栈详解 + 彻底理解Java的值传递和引用传递
本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...
- 【Java】 参数的传递:值传递与引用传递讨论
内容稍多,可直接看第4点的讨论结果 前言 在涉及到传递参数给方法时,容易出现一些参数传递错误的问题,这就涉及到了参数的传递问题,必须搞清楚:参数是如何传递到方法中的?一般来说,参数的传递可以分为两种: ...
- 第002弹:Java 中的值传递和引用传递
在 Java 的代码开发过程中,为了尽可能提高方法的复用性,明确方法的作用,同时防止一个方法内部过于臃肿的问题,往往会创建许多方法,那么不可避免地会涉及到参数传递的问题.通常来说,我们将 Java 中 ...
- 一个随意list引发的惨案(java到底是值传递还是引用 传递?)
前两天写了一个递归,因为太年轻,把一个递归方法需要用到的list定义该递归方法外了,结果开始断点测试的时候有点小问题 ,然后上线之后因为数据量太多导致了一个java.util.ConcurrentMo ...
随机推荐
- 爬虫案例2-爬取视频的三种方式之一:requests篇(1)
@ 目录 前言 爬虫步骤 确定网址,发送请求 获取响应数据 对响应数据进行解析 保存数据 完整源码 共勉 博客 前言 本文写了一个爬取视频的案例,使用requests库爬取了好看视频的视频,并进行保存 ...
- 钉钉H5微应用本地开发调试记录
准备工具: 手机(ios,安卓) 安卓手机可以用网易Mumu模拟器,下载一个移动版钉钉 钉钉开放文档 本地开发的话,可以去钉钉后台管理系统,将你的本地ip地址配置成应用的首页,比如 10.xx.xx. ...
- Linux下Shell脚本实现统一管理服务启停重启
公司今年开始了大批量的裁员,人心惶惶,所以强迫自己学习点新知识,刚好领导给找了个事情,让写个脚本实现一键启停Linux服务器上的服务,于是开始研究这个怎么搞. 最开始的时候,有点想当然了,觉得一键启停 ...
- 网络安全&密码学—python中的各种加密算法
网络安全&密码学-python中的各种加密算法 一.简介 数据加密是一种保护数据安全的技术,通过将数据(明文)转换为不易被未经授权的人理解的形式(密文),以防止数据泄露.篡改或滥用.加密后的数 ...
- AD域下,域管理员网络无法正常连接
排错思路:1.是否拥有上网权限, test 超级管理员自然是有上网权限的(该项排除): 2.浏览器是否使用了代理 ,有些软件在安装的时候,会自动启用浏览器的代理,开启某些特定的端口: 3.其他原因 解 ...
- 【赵渝强老师】什么是PL/SQL?
一.什么是PL/SQL? PL/SQL(Procedure Language/SQL)是oracle在标准的sql语言上的扩展.ql/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许私用条件语 ...
- 高通ramdump
背景 高通平台下提供了一个工具,专门用来抓取内核死机以后的dump信息.如果只是非系统层面的crash(例如底层应用,安卓程序),则不能抓取dump信息. 在阅读一些文档的时候知道有这个功能,但是一直 ...
- 使用KFold交叉验证方法划分训练集和验证集
在进行深度学习时,为了提高精度,或者为了评估我们模型的优劣,以及如何选择一个更好的模型.这样我们就需要用到交叉验证方法. 我们主要实现如何使用KFold划分训练集和验证集 #coding:utf-8f ...
- react -- 什么是jsx
概念:JSX 就是js和xml的缩写,表示在js代码中编写html模板结构,他是react中编写UI模板的方式 优势:html的声明式模板写法 js的可编程能力
- 1. 什么是three.js?
Three.js是一个基于JavaScript编写的开源3D图形库,它使用WebGL技术在网页上渲染3D图形.Three.js提供了许多高级功能,如几何体.纹理.光照.阴影等,以便开发者能够快速地创建 ...